diff --git a/.dockerignore b/.dockerignore index 3c813a94d2..90f6ee964f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,7 +4,6 @@ target/ .vscode/ query-node/**/dist query-node/lib -cli/ tests/ !tests/network-tests/proposal-parameters.json devops/ diff --git a/.env b/.env index 5940df2218..6074b3efe4 100644 --- a/.env +++ b/.env @@ -24,6 +24,8 @@ BLOCK_HEIGHT=0 # Query node GraphQL server port # Remember to change it in COLOSSUS_QUERY_NODE_URL and DISTRIBUTOR_QUERY_NODE_URL as well GRAPHQL_SERVER_PORT=8081 +PROCESSOR_STATE_APP_PORT=8082 +PROCESSOR_HOST=processor # Query node playground endpoint # Leave it blank if you want endpoint to be copied from browser's URL @@ -55,31 +57,38 @@ DISTRIBUTOR_QUERY_NODE_URL=http://graphql-server:8081/graphql # Indexer gateway used by processor. If you don't use the local indexer set this to a remote gateway PROCESSOR_INDEXER_GATEWAY=http://hydra-indexer-gateway:4000/graphql +# State update endpoint used by prcessor (to send state updates) +STATE_UPDATE_ENDPOINT=http://graphql-server:8082/update-processor-state + # Colossus services identities -COLOSSUS_1_WORKER_ID=0 -COLOSSUS_1_WORKER_URI=//testing//worker//Storage//${COLOSSUS_1_WORKER_ID} +# Assuming hired lead has worker id 0 +COLOSSUS_1_WORKER_ID=1 +COLOSSUS_1_WORKER_URI=//testing//worker//Storage//1 COLOSSUS_1_TRANSACTOR_URI=//Colossus1 -COLOSSUS_2_WORKER_ID=1 -COLOSSUS_2_WORKER_URI=//testing//worker//Storage//${COLOSSUS_2_WORKER_ID} +COLOSSUS_2_WORKER_ID=2 +COLOSSUS_2_WORKER_URI=//testing//worker//Storage//2 COLOSSUS_2_TRANSACTOR_URI=//Colossus2 # Distributor node services identities -DISTRIBUTOR_1_WORKER_ID=0 -DISTRIBUTOR_1_ACCOUNT_URI=//testing//worker//Distribution//0 +# Assuming hired lead has worker id 0 +DISTRIBUTOR_1_WORKER_ID=1 +DISTRIBUTOR_1_ACCOUNT_URI=//testing//worker//Distribution//1 -DISTRIBUTOR_2_WORKER_ID=1 -DISTRIBUTOR_2_ACCOUNT_URI=//testing//worker//Distribution//1 +DISTRIBUTOR_2_WORKER_ID=2 +DISTRIBUTOR_2_ACCOUNT_URI=//testing//worker//Distribution//2 # Membership Faucet -SCREENING_AUTHORITY_SEED=//Alice -INVITING_MEMBER_ID=0 +INVITER_KEY= # SendGrid API key SENDGRID_API_KEY= # Destination email address for failure alerts ALERT_TO_EMAIL= ALERT_FROM_EMAIL= -BALANCE_TOP_UP_AMOUNT=10 +# HCaptcha secret API key +HCAPTCHA_SECRET= +BALANCE_CREDIT=300000000000 +BALANCE_LOCKED=300000000000 # joystream/node docker image tag # We do not provide a default value - scripts that startup a joystream-node service diff --git a/.github/workflows/create-ami.yml b/.github/workflows/create-ami.yml deleted file mode 100644 index 20b3e139e5..0000000000 --- a/.github/workflows/create-ami.yml +++ /dev/null @@ -1,76 +0,0 @@ -# Creates an AWS AMI (system image) with compiled joystream-node and subkey -# -name: Create AWS AMI - -on: - workflow_dispatch: - inputs: - runtimeProfile: - description: 'STAGING | TESTING - leave blank for production build' - required: false - -jobs: - build: - name: Build the code and run setup - runs-on: ubuntu-latest - env: - STACK_NAME: create-joystream-node-ami-ga-${{ github.run_number }} - KEY_NAME: joystream-github-action-key-new - steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - - name: Set AMI Name environment variable - shell: bash - run: echo "ami_name=joystream-node-${{ steps.extract_branch.outputs.branch }}-${{ github.run_number }}" >> $GITHUB_ENV - id: ami_name - - - name: Checkout - uses: actions/checkout@v2 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - - name: Deploy to AWS CloudFormation - uses: aws-actions/aws-cloudformation-github-deploy@v1 - id: deploy_stack - with: - name: ${{ env.STACK_NAME }} - template: devops/aws/cloudformation/single-instance.yml - no-fail-on-empty-changeset: '1' - parameter-overrides: 'KeyName=${{ env.KEY_NAME }}' - - - name: Install Ansible dependencies - run: pipx inject ansible-core boto3 botocore - - - name: Run playbook - uses: dawidd6/action-ansible-playbook@v2 - with: - playbook: create-joystream-node-ami-playbook.yml - directory: devops/aws - requirements: requirements.yml - key: ${{ secrets.SSH_PRIVATE_KEY }} - inventory: | - [all] - ${{ steps.deploy_stack.outputs.PublicIp }} - options: | - --extra-vars "git_repo=https://github.com/${{ github.repository }} \ - branch_name=${{ steps.extract_branch.outputs.branch }} \ - instance_id=${{ steps.deploy_stack.outputs.InstanceId }} \ - ami_name=${{ env.ami_name }} \ - runtime_profile=${{ github.event.inputs.runtimeProfile }}" - - - name: Delete CloudFormation Stack - if: always() - continue-on-error: true - run: | - echo "Deleting ${{ env.STACK_NAME }} stack" - aws cloudformation delete-stack --stack-name ${{ env.STACK_NAME }} - echo "Waiting for ${{ env.STACK_NAME }} to be deleted..." - aws cloudformation wait stack-delete-complete --stack-name ${{ env.STACK_NAME }} diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4e3613364e..555cd2151f 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -18,7 +18,7 @@ jobs: runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - id: compute_shasum name: Compute runtime code shasum @@ -39,52 +39,18 @@ jobs: tar czvf joystream-node-macos.tar.gz -C ./target/release joystream-node - name: Temporarily save node binary - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: joystream-node-macos-${{ steps.compute_shasum.outputs.shasum }} path: joystream-node-macos.tar.gz retention-days: 1 - build-rpi-binary: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - id: compute_shasum - name: Compute runtime code shasum - run: | - export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh` - echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}" - - - name: Run Setup - run: | - ./setup.sh - - - name: Build binaries - run: | - export WORKSPACE_ROOT=`cargo metadata --offline --no-deps --format-version 1 | jq .workspace_root -r` - sudo chmod a+w $WORKSPACE_ROOT - sudo chmod -R a+w $HOME/.cargo/registry - ./scripts/raspberry-cross-build.sh - - - name: Tar the binary - run: | - tar czvf joystream-node-rpi.tar.gz -C ./target/arm-unknown-linux-gnueabihf/release joystream-node - - - name: Temporarily save node binary - uses: actions/upload-artifact@v2 - with: - name: joystream-node-rpi-${{ steps.compute_shasum.outputs.shasum }} - path: joystream-node-rpi.tar.gz - retention-days: 1 - create-release: runs-on: ubuntu-latest - needs: [build-mac-binary, build-rpi-binary] + needs: build-mac-binary steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - id: compute_shasum name: Compute runtime code shasum @@ -113,23 +79,14 @@ jobs: docker cp $(docker create --rm $IMAGE-arm64):/joystream/node ./joystream-node tar -czvf joystream-node-$VERSION_AND_COMMIT-arm64-linux-gnu.tar.gz joystream-node - docker cp $(docker create --rm $IMAGE-arm):/joystream/node ./joystream-node - tar -czvf joystream-node-$VERSION_AND_COMMIT-armv7-linux-gnu.tar.gz joystream-node - - name: Retrieve saved MacOS binary - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: joystream-node-macos-${{ steps.compute_shasum.outputs.shasum }} - - name: Retrieve saved RPi binary - uses: actions/download-artifact@v2 - with: - name: joystream-node-rpi-${{ steps.compute_shasum.outputs.shasum }} - - - name: Rename MacOS and RPi tar + - name: Rename MacOS binary and tar run: | mv joystream-node-macos.tar.gz joystream-node-${{ steps.extract_binaries.outputs.version_and_commit }}-x86_64-macos.tar.gz - mv joystream-node-rpi.tar.gz joystream-node-${{ steps.extract_binaries.outputs.version_and_commit }}-rpi.tar.gz - name: Release uses: softprops/action-gh-release@v1 diff --git a/.github/workflows/deploy-node-network.yml b/.github/workflows/deploy-node-network.yml index 5a89338e4b..316fded3f3 100644 --- a/.github/workflows/deploy-node-network.yml +++ b/.github/workflows/deploy-node-network.yml @@ -3,47 +3,42 @@ name: Deploy Network on: workflow_dispatch: inputs: - jsonInput: - description: 'Json input (refer to .pipelines/deploy-node-network-inputs.json)' + networkConfiguration: + description: 'Configuration (refer to .pipelines/deploy-node-network-inputs.json)' required: true default: '' defaults: run: - working-directory: devops/aws + working-directory: devops/ansible jobs: deploy-node-network: - name: Create CloudFormation stack and run Ansible playbook + name: Deploy New Joystream Chain runs-on: ubuntu-latest env: - STACK_NAME: ga-deploy-node-network-${{ github.run_number }} + STACK_NAME: network-deployment-${{ github.run_number }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set env variables - id: myoutputs # set the outputs + id: network_config # set the outputs run: | - jsonInput=$(jq -r '.inputs.jsonInput' $GITHUB_EVENT_PATH) + jsonInput=$(jq -r '.inputs.networkConfiguration' $GITHUB_EVENT_PATH) export ENCRYPTION_KEY=$(echo $jsonInput | jq -r '.encryptionKey.value') echo ::set-output name=encryptionKey::$ENCRYPTION_KEY echo "::add-mask::$ENCRYPTION_KEY" echo ::set-output name=gitRepo::$(echo $jsonInput | jq -r '.gitRepo.value') echo ::set-output name=branchName::$(echo $jsonInput | jq -r '.branchName.value') - echo ::set-output name=numberOfValidators::$(echo $jsonInput | jq -r '.numberOfValidators.value') - echo ::set-output name=validatorInstanceType::$(echo $jsonInput | jq -r '.validatorInstanceType.value') - echo ::set-output name=buildInstanceType::$(echo $jsonInput | jq -r '.buildInstanceType.value') - echo ::set-output name=rpcInstanceType::$(echo $jsonInput | jq -r '.rpcInstanceType.value') - echo ::set-output name=ec2AMI::$(echo $jsonInput | jq -r '.ec2AMI.value') - echo ::set-output name=networkSuffix::$(echo $jsonInput | jq -r '.networkSuffix.value') + echo ::set-output name=instanceType::$(echo $jsonInput | jq -r '.instanceType.value') + echo ::set-output name=networkName::$(echo $jsonInput | jq -r '.networkName.value') + echo ::set-output name=networkId::$(echo $jsonInput | jq -r '.networkId.value') echo ::set-output name=deploymentType::$(echo $jsonInput | jq -r '.deploymentType.value') echo ::set-output name=volumeSize::$(echo $jsonInput | jq -r '.volumeSize.value') - echo ::set-output name=rpcVolumeSize::$(echo $jsonInput | jq -r '.rpcVolumeSize.value') - echo ::set-output name=skipChainSetup::$(echo $jsonInput | jq -r '.skipChainSetup.value') echo ::set-output name=runtimeProfile::$(echo $jsonInput | jq -r '.runtimeProfile.value') + echo ::set-output name=endowAccounts::$(echo $jsonInput | jq -r '.endowAccounts.value') initialBalancesFile=$(echo $jsonInput | jq -r '.initialBalancesFile.value') - initialMembersFile=$(echo $jsonInput | jq -r '.initialMembersFile.value') if [ -z "$initialBalancesFile" ] then @@ -53,16 +48,17 @@ jobs: echo ::set-output name=initialBalancesFilePath::'initial-balances.json' fi - if [ -z "$initialMembersFile" ] - then - echo ::set-output name=initialMembersFilePath::'' - else - wget $initialMembersFile -O initial-members.json - echo ::set-output name=initialMembersFilePath::'initial-members.json' - fi + - name: Install python3 netaddr + run: sudo apt-get install -y --no-install-recommends python3-netaddr - - name: Install Ansible dependencies - run: pipx inject ansible-core boto3 botocore + - name: Install python netaddr + run: sudo apt install -y --no-install-recommends python-netaddr + + - name: Install Ansible + run: | + pip3 install --upgrade --user ansible + pipx inject ansible-core boto3 botocore + ansible-playbook --version - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 @@ -86,81 +82,60 @@ jobs: id: deploy_stack with: name: ${{ env.STACK_NAME }} - template: devops/aws/cloudformation/infrastructure.yml + template: devops/aws/cloudformation/network.yml no-fail-on-empty-changeset: '1' parameter-overrides: >- KeyName=joystream-github-action-key-new, - ValidatorEC2InstanceType=${{ steps.myoutputs.outputs.validatorInstanceType }}, - RPCEC2InstanceType=${{ steps.myoutputs.outputs.rpcInstanceType }}, - BuildEC2InstanceType=${{ steps.myoutputs.outputs.buildInstanceType }}, - EC2AMI=${{ steps.myoutputs.outputs.ec2AMI }}, - NumberOfValidators=${{ steps.myoutputs.outputs.numberOfValidators }}, - VolumeSize=${{ steps.myoutputs.outputs.volumeSize }}, - RPCVolumeSize=${{ steps.myoutputs.outputs.rpcVolumeSize }} + EC2InstanceType=${{ steps.network_config.outputs.instanceType }}, + VolumeSize=${{ steps.network_config.outputs.volumeSize }} - name: Prepare inventory for Ansible run: | - ASG=${{ steps.deploy_stack.outputs.AutoScalingId }} - - VALIDATORS="" - - INSTANCES=$(aws autoscaling describe-auto-scaling-instances \ - --query "AutoScalingInstances[?AutoScalingGroupName=='${ASG}'].InstanceId" --output text); - - for ID in $INSTANCES - do - IP=$(aws ec2 describe-instances --instance-ids $ID --query "Reservations[].Instances[].PublicIpAddress" --output text) - VALIDATORS+="$IP\n" - done - - echo -e "[build]\n${{ steps.deploy_stack.outputs.BuildPublicIp }}\n" >> inventory - echo -e "[validators]\n$VALIDATORS" >> inventory - echo -e "[rpc]\n${{ steps.deploy_stack.outputs.RPCPublicIp }}" >> inventory + VAL1="${{ steps.deploy_stack.outputs.Val1PublicIp }}" + VAL2="${{ steps.deploy_stack.outputs.Val2PublicIp }}" + VAL3="${{ steps.deploy_stack.outputs.Val3PublicIp }}" + echo -e "[validators]\n$VAL1\n$VAL2\n\n" >> inventory + echo -e "[boot]\n$VAL3\n\n" >> inventory + echo -e "[build]\n${{ steps.deploy_stack.outputs.BuildPublicIp }}\n\n" >> inventory + echo -e "[rpc]\n${{ steps.deploy_stack.outputs.RPCPublicIp }}\n" >> inventory cat inventory - - name: Run playbook to setup all hosts and compile joystream-node + # Always Install tools + - name: Install tools on all hosts uses: dawidd6/action-ansible-playbook@v2 - # Build binaries if AMI not specified - if: steps.myoutputs.outputs.ec2AMI == '' with: - playbook: build-code.yml - directory: devops/aws + playbook: install-tools.yml + directory: devops/ansible requirements: requirements.yml key: ${{ secrets.SSH_PRIVATE_KEY }} options: | --inventory inventory - --extra-vars "branch_name=${{ steps.myoutputs.outputs.branchName }} \ - git_repo=${{ steps.myoutputs.outputs.gitRepo }} data_path=mydata \ - runtime_profile=${{ steps.myoutputs.outputs.runtimeProfile }}" - - name: Run playbook to install additional utils on build server + # Build + - name: Build code uses: dawidd6/action-ansible-playbook@v2 - if: steps.myoutputs.outputs.ec2AMI == '' with: - playbook: setup-build-server.yml - directory: devops/aws + playbook: build-code.yml + directory: devops/ansible requirements: requirements.yml key: ${{ secrets.SSH_PRIVATE_KEY }} options: | --inventory inventory + --extra-vars "branch_name=${{ steps.network_config.outputs.branchName }} \ + git_repo=${{ steps.network_config.outputs.gitRepo }} data_path=deploy_artifacts \ + runtime_profile=${{ steps.network_config.outputs.runtimeProfile }}" - - name: Run playbook to configure chain-spec + # Always Fetch binaries + - name: Fetch binaries from build host uses: dawidd6/action-ansible-playbook@v2 with: - playbook: configure-network.yml - directory: devops/aws + playbook: fetch-binaries.yml + directory: devops/ansible requirements: requirements.yml key: ${{ secrets.SSH_PRIVATE_KEY }} options: | --inventory inventory - --extra-vars "network_suffix=${{ steps.myoutputs.outputs.networkSuffix }} data_path=mydata \ - number_of_validators=${{ steps.myoutputs.outputs.numberOfValidators }} \ - git_repo=${{ steps.myoutputs.outputs.gitRepo }} \ - deployment_type=${{ steps.myoutputs.outputs.deploymentType }} \ - branch_name=${{ steps.myoutputs.outputs.branchName }} \ - initial_members_file=${{ steps.myoutputs.outputs.initialMembersFilePath }} \ - initial_balances_file=${{ steps.myoutputs.outputs.initialBalancesFilePath }} \ - skip_chain_setup=${{ steps.myoutputs.outputs.skipChainSetup }}" + --extra-vars "data_path=deploy_artifacts" - name: Terminate Build instance continue-on-error: true @@ -168,21 +143,34 @@ jobs: echo "Deleting build instance with id ${{ steps.deploy_stack.outputs.BuildInstanceId }}" aws ec2 terminate-instances --instance-ids ${{ steps.deploy_stack.outputs.BuildInstanceId }} + # Configure and start chain + - name: Run playbook to configure chain-spec + uses: dawidd6/action-ansible-playbook@v2 + with: + playbook: deploy-network.yml + directory: devops/ansible + requirements: requirements.yml + key: ${{ secrets.SSH_PRIVATE_KEY }} + options: | + --inventory inventory + --extra-vars "network_name='${{ steps.network_config.outputs.networkName }}' \ + network_id=${{ steps.network_config.outputs.networkId }} \ + data_path=deploy_artifacts \ + deployment_type=${{ steps.network_config.outputs.deploymentType }} \ + initial_balances_file=${{ steps.network_config.outputs.initialBalancesFilePath }} \ + endow_accounts=${{ steps.network_config.outputs.endowAccounts }} \ + chainspec_creation_strategy='generate'" + - name: Encrpyt the artifacts run: | - 7z a -p${{ steps.myoutputs.outputs.encryptionKey }} chain-data.7z mydata/* + cp inventory deploy_artifacts/ + 7z a -p${{ steps.network_config.outputs.encryptionKey }} chain-data.7z deploy_artifacts/* - name: Save the output as an artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: data-chainspec-auth - path: devops/aws/chain-data.7z - - - name: Save the endpoints file as an artifact - uses: actions/upload-artifact@v2 - with: - name: endpoints - path: devops/aws/endpoints.json + path: devops/ansible/chain-data.7z - name: Delete CloudFormation Stack if any step failed # Skip only if stack already existed or all steps passed succesfully diff --git a/.github/workflows/deploy-playground.yml b/.github/workflows/deploy-playground.yml index 39abfecfaf..08ae33abd8 100644 --- a/.github/workflows/deploy-playground.yml +++ b/.github/workflows/deploy-playground.yml @@ -11,25 +11,37 @@ on: description: 'Branch to deploy' required: false default: 'master' + runtimeProfile: + description: 'STAGING | PLAYGROUND | TESTING - leave balnk for production' + default: 'PLAYGROUND' + required: false sshPubKey: description: 'SSH pubkey eg. `ssh-rsa AAAAB3NzaC1yc2EA....0hc3GND8IR mysshkey`' required: false - instanceType: - description: 'AWS EC2 instance type (t2.micro, t2.large)' - required: false - default: 't2.micro' stackNamePrefix: description: 'Additional identifier to include in stack name' required: false default: 'playground' skipChainSetup: description: 'Optionally skip running newChainSetup script (true or false)' - required: true + required: false default: 'false' - runtimeProfile: - description: 'STAGING | PLAYGROUND | TESTING - leave balnk for production' + chainSetupScenario: + description: 'Scenario name to run after chain stats' + required: false + default: 'setupNewChainMultiStorage' + sudoSuri: + description: 'SURI of sudo account - must be different than treasury' + required: false + default: '//Alice' + treasurySuri: + description: 'SURI of treasury account - must be different than sudo' + required: false + default: '//Bob' + initialBalances: + description: 'JSON string or http URL to override initial balances and vesting config' + default: '' required: false - defaults: run: working-directory: devops/aws @@ -42,10 +54,13 @@ jobs: STACK_NAME: ${{ github.event.inputs.stackNamePrefix }}-${{ github.event.inputs.branchName }}-${{ github.run_number }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - name: Install Ansible dependencies - run: pipx inject ansible-core boto3 botocore + - name: Install Ansible + run: | + pip3 install --upgrade --user ansible + pipx inject ansible-core boto3 botocore + ansible-playbook --version - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 @@ -69,19 +84,18 @@ jobs: id: deploy_stack with: name: ${{ env.STACK_NAME }} - template: devops/aws/cloudformation/single-instance-docker.yml + template: devops/aws/cloudformation/single-instance.yml no-fail-on-empty-changeset: '1' - parameter-overrides: 'KeyName=joystream-github-action-key-new,EC2InstanceType=${{ github.event.inputs.instanceType }}' + parameter-overrides: 'KeyName=joystream-github-action-key-new,EC2InstanceType=t2.large' - name: Run playbook uses: dawidd6/action-ansible-playbook@v2 with: playbook: deploy-playground-playbook.yml - directory: devops/aws + directory: devops/ansible requirements: requirements.yml key: ${{ secrets.SSH_PRIVATE_KEY }} inventory: | - [all] ${{ steps.deploy_stack.outputs.PublicIp }} options: | --extra-vars "git_repo=${{ github.event.inputs.gitRepo }} \ @@ -89,13 +103,18 @@ jobs: skip_chain_setup=${{ github.event.inputs.skipChainSetup }} \ stack_name=${{ env.STACK_NAME }} \ runtime_profile=${{ github.event.inputs.runtimeProfile }} \ - ssh_pub_key='${{ github.event.inputs.sshPubKey }}'" + ssh_pub_key='${{ github.event.inputs.sshPubKey }}' \ + sudo_suri='${{ github.event.inputs.sudoSuri }}' \ + treasury_suri='${{ github.event.inputs.treasurySuri }}' \ + initial_balances='${{ github.event.inputs.initialBalances }}' \ + init_chain_scenario='${{ github.event.inputs.chainSetupScenario }}'" + --verbose - name: Save the endpoints file as an artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: endpoints - path: devops/aws/endpoints.json + path: devops/ansible/endpoints.json - name: Delete CloudFormation Stack if any step failed # Skip only if stack already existed or all steps passed successfully diff --git a/.github/workflows/joystream-apps-docker.yml b/.github/workflows/joystream-apps-docker.yml index f29e639561..d253aa86b7 100644 --- a/.github/workflows/joystream-apps-docker.yml +++ b/.github/workflows/joystream-apps-docker.yml @@ -11,19 +11,19 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Extract branch name shell: bash run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" id: extract_branch - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and push id: docker_build - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: file: apps.Dockerfile push: true diff --git a/.github/workflows/joystream-cli.yml b/.github/workflows/joystream-cli.yml index f1256dfd3d..c5229a0253 100644 --- a/.github/workflows/joystream-cli.yml +++ b/.github/workflows/joystream-cli.yml @@ -9,9 +9,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -19,7 +19,6 @@ jobs: yarn install --frozen-lockfile yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/cli checks --quiet - name: yarn pack test run: | yarn workspace @joystream/cli pack --filename cli-pack-test.tgz @@ -33,9 +32,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -43,7 +42,6 @@ jobs: yarn install --frozen-lockfile --network-timeout 120000 yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/cli checks --quiet - name: yarn pack test run: | yarn workspace @joystream/cli pack --filename cli-pack-test.tgz diff --git a/.github/workflows/joystream-node-docker-dev.yml b/.github/workflows/joystream-node-docker-dev.yml index 58946694c1..943c9dccf7 100644 --- a/.github/workflows/joystream-node-docker-dev.yml +++ b/.github/workflows/joystream-node-docker-dev.yml @@ -2,7 +2,9 @@ # Only built for amd64 on ubuntu name: joystream-node-docker(dev) -on: push +on: + - push + - workflow_dispatch env: REPOSITORY: joystream/node @@ -16,30 +18,24 @@ jobs: runtime_profile: ['STAGING', 'PLAYGROUND', 'TESTING'] include: - runtime_profile: 'STAGING' - cargo_features: 'staging_runtime' + cargo_features: 'staging-runtime' - runtime_profile: 'PLAYGROUND' - cargo_features: 'playground_runtime' + cargo_features: 'playground-runtime' - runtime_profile: 'TESTING' - cargo_features: 'testing_runtime' + cargo_features: 'testing-runtime' env: RUNTIME_PROFILE: ${{ matrix.runtime_profile }} steps: - - name: Checkout - uses: actions/checkout@v2 - - - uses: actions/setup-node@v1 - with: - node-version: '14.x' - + - name: Checkout sources + uses: actions/checkout@v3 - id: compute_shasum name: Compute runtime code shasum run: | export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh` echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}" - - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} @@ -52,12 +48,14 @@ jobs: echo "::set-output name=image_exists::${IMAGE_EXISTS}" - name: Build and push - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: joystream-node.Dockerfile platforms: linux/amd64 - build-args: CARGO_FEATURES=${{ matrix.cargo_features }} + build-args: | + CARGO_FEATURES=${{ matrix.cargo_features }} + CODE_SHASUM=${{ steps.compute_shasum.outputs.shasum }} push: true tags: ${{ env.REPOSITORY }}:${{ steps.compute_shasum.outputs.shasum }} if: ${{ steps.compute_image_exists.outputs.image_exists == 1 }} diff --git a/.github/workflows/joystream-node-docker.yml b/.github/workflows/joystream-node-docker.yml index 980dd45c64..c6ba36dcab 100644 --- a/.github/workflows/joystream-node-docker.yml +++ b/.github/workflows/joystream-node-docker.yml @@ -1,24 +1,32 @@ # Production runtime build of joystream-node name: joystream-node-docker -on: push +on: + - push + - workflow_dispatch env: REPOSITORY: joystream/node KEY_NAME: joystream-github-action-key-new jobs: - push-amd64: - name: Build joystream/node Docker image for amd64 + repo-check: + name: Check if main image already published runs-on: ubuntu-latest outputs: - tag_shasum: ${{ steps.compute_shasum.outputs.shasum }} + shasum: ${{ steps.compute_shasum.outputs.shasum }} image_exists: ${{ steps.compute_main_image_exists.outputs.image_exists }} + branch_name: ${{ steps.extract_branch.outputs.branch }} steps: + - name: Extract branch name + shell: bash + run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" + id: extract_branch + - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v3 with: node-version: '14.x' @@ -28,86 +36,57 @@ jobs: export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh` echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}" - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Check if we have already have the manifest on Dockerhub + - name: Check if we already have the main image on Dockerhub id: compute_main_image_exists # Will output 0 if image exists and 1 if does not exists run: | export IMAGE_EXISTS=$(docker manifest inspect ${{ env.REPOSITORY }}:${{ steps.compute_shasum.outputs.shasum }} > /dev/null ; echo $?) echo "::set-output name=image_exists::${IMAGE_EXISTS}" - - name: Check if we have pre-built image on Dockerhub - id: compute_image_exists - # Will output 0 if image exists and 1 if does not exists - run: | - export IMAGE_EXISTS=$(docker manifest inspect ${{ env.REPOSITORY }}:${{ steps.compute_shasum.outputs.shasum }}-amd64 > /dev/null ; echo $?) - echo "::set-output name=image_exists::${IMAGE_EXISTS}" - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: joystream-node.Dockerfile - platforms: linux/amd64 - push: true - tags: ${{ env.REPOSITORY }}:${{ steps.compute_shasum.outputs.shasum }}-amd64 - if: ${{ steps.compute_image_exists.outputs.image_exists == 1 }} - - push-arm: - name: Build joystream/node Docker image for arm + build-images: + name: Build joystream/node Docker images + needs: repo-check + # Only run this job if the main image does not exist + if: needs.repo-check.outputs.image_exists == 1 runs-on: ubuntu-latest strategy: matrix: - platform: ['linux/arm64', 'linux/arm/v7'] + platform: ['linux/amd64', 'linux/arm64'] include: + - platform: 'linux/amd64' + platform_tag: 'amd64' + file: 'joystream-node.Dockerfile' + ec2ami: 'ami-0149b2da6ceec4bb0' + ec2type: 'c6id.2xlarge' - platform: 'linux/arm64' platform_tag: 'arm64' file: 'joystream-node.Dockerfile' - - platform: 'linux/arm/v7' - platform_tag: 'arm' - file: 'joystream-node-armv7.Dockerfile' + ec2ami: 'ami-00266f51b6b22db58' + ec2type: 't4g.2xlarge' env: STACK_NAME: build-joystream-node-docker-ga-${{ github.run_number }}-${{ matrix.platform_tag }} steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v3 with: node-version: '14.x' - - name: Install Ansible dependencies - run: pipx inject ansible-core boto3 botocore - - - id: compute_shasum - name: Compute runtime code shasum - run: | - export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh` - echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}" - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Check if we have pre-built image on Dockerhub id: compute_image_exists # Will output 0 if image exists and 1 if does not exists run: | - export IMAGE_EXISTS=$(docker manifest inspect ${{ env.REPOSITORY }}:${{ steps.compute_shasum.outputs.shasum }}-${{ matrix.platform_tag }} > /dev/null ; echo $?) + export IMAGE_EXISTS=$(docker manifest inspect ${{ env.REPOSITORY }}:${{ needs.repo-check.outputs.shasum }}-${{ matrix.platform_tag }} > /dev/null ; echo $?) echo "::set-output name=image_exists::${IMAGE_EXISTS}" + - name: Install Ansible + run: | + pip3 install --upgrade --user ansible + pipx inject ansible-core boto3 botocore + ansible-playbook --version + if: ${{ steps.compute_image_exists.outputs.image_exists == 1 }} + - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: @@ -121,29 +100,30 @@ jobs: id: deploy_stack with: name: ${{ env.STACK_NAME }} - template: devops/aws/cloudformation/single-instance-docker.yml + template: devops/aws/cloudformation/single-instance.yml no-fail-on-empty-changeset: '1' - parameter-overrides: 'KeyName=${{ env.KEY_NAME }},EC2AMI=ami-00d1ab6b335f217cf,EC2InstanceType=t4g.xlarge' + parameter-overrides: 'KeyName=${{ env.KEY_NAME }},EC2AMI=${{ matrix.ec2ami }},EC2InstanceType=${{ matrix.ec2type }}' if: ${{ steps.compute_image_exists.outputs.image_exists == 1 }} - name: Run playbook uses: dawidd6/action-ansible-playbook@v2 with: - playbook: build-arm64-playbook.yml - directory: devops/aws + playbook: build-joystream-node-docker.yml + directory: devops/ansible requirements: requirements.yml key: ${{ secrets.SSH_PRIVATE_KEY }} inventory: | - [all] ${{ steps.deploy_stack.outputs.PublicIp }} options: | --extra-vars "git_repo=https://github.com/${{ github.repository }} \ - branch_name=${{ steps.extract_branch.outputs.branch }} \ + branch_name=${{ needs.repo-check.outputs.branch_name }} \ docker_username=${{ secrets.DOCKERHUB_USERNAME }} \ docker_password=${{ secrets.DOCKERHUB_PASSWORD }} \ - tag_name=${{ steps.compute_shasum.outputs.shasum }}-${{ matrix.platform_tag }} \ + tag_name=${{ needs.repo-check.outputs.shasum }}-${{ matrix.platform_tag }} \ repository=${{ env.REPOSITORY }} dockerfile=${{ matrix.file }} \ - platform=${{ matrix.platform }}" + platform=${{ matrix.platform }} \ + cargo_features='' \ + code_shasum=${{ needs.repo-check.outputs.shasum }}" if: ${{ steps.compute_image_exists.outputs.image_exists == 1 }} - name: Delete CloudFormation Stack @@ -156,16 +136,16 @@ jobs: aws cloudformation wait stack-delete-complete --stack-name ${{ env.STACK_NAME }} push-manifest: - name: Create manifest using both the arch images - needs: [push-amd64, push-arm] + name: Create main manifest + needs: [repo-check, build-images] # Only run this job if the image does not exist with tag equal to the shasum - if: needs.push-amd64.outputs.image_exists == 1 + if: needs.repo-check.outputs.image_exists == 1 runs-on: ubuntu-latest env: - TAG_SHASUM: ${{ needs.push-amd64.outputs.tag_shasum }} + TAG_SHASUM: ${{ needs.repo-check.outputs.shasum }} steps: - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} @@ -177,11 +157,9 @@ jobs: echo $IMAGE docker pull $IMAGE-amd64 docker pull $IMAGE-arm64 - docker pull $IMAGE-arm - docker manifest create $IMAGE $IMAGE-amd64 $IMAGE-arm64 $IMAGE-arm + docker manifest create $IMAGE $IMAGE-amd64 $IMAGE-arm64 docker manifest annotate $IMAGE $IMAGE-amd64 --arch amd64 docker manifest annotate $IMAGE $IMAGE-arm64 --arch arm64 - docker manifest annotate $IMAGE $IMAGE-arm --arch arm docker manifest push $IMAGE - name: Create manifest with latest tag for master @@ -189,8 +167,7 @@ jobs: run: | IMAGE=${{ env.REPOSITORY }}:${{ env.TAG_SHASUM }} LATEST_TAG=${{ env.REPOSITORY }}:latest - docker manifest create $LATEST_TAG $IMAGE-amd64 $IMAGE-arm64 $IMAGE-arm + docker manifest create $LATEST_TAG $IMAGE-amd64 $IMAGE-arm64 docker manifest annotate $LATEST_TAG $IMAGE-amd64 --arch amd64 docker manifest annotate $LATEST_TAG $IMAGE-arm64 --arch arm64 - docker manifest annotate $LATEST_TAG $IMAGE-arm --arch arm docker manifest push $LATEST_TAG diff --git a/.github/workflows/joystream-node.yml b/.github/workflows/joystream-node.yml index 04498b9a9c..5193434505 100644 --- a/.github/workflows/joystream-node.yml +++ b/.github/workflows/joystream-node.yml @@ -1,22 +1,24 @@ name: joystream-node on: pull_request: + push: jobs: + # test runtime benchmarks code correctness benchmarking: name: Benchmarking runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '14.x' - uses: technote-space/get-diff-action@v3 with: PREFIX_FILTER: | - node + bin + runtime runtime-modules - utils/chain-spec-builder SUFFIX_FILTER: | .rs FILES: | @@ -33,17 +35,17 @@ jobs: if: env.GIT_DIFF - name: Build + env: + WASM_BUILD_TOOLCHAIN: nightly-2022-05-11 run: | - pushd node - WASM_BUILD_TOOLCHAIN=nightly-2021-02-20 cargo +nightly-2021-02-20 build --release --features runtime-benchmarks - popd + cargo +nightly-2022-05-11 clippy --release --features runtime-benchmarks && + cargo +nightly-2022-05-11 test --release --features runtime-benchmarks && + cargo +nightly-2022-05-11 build --release --features runtime-benchmarks if: env.GIT_DIFF - - name: Generate Weights + - name: Test Generate Weights run: | - ./scripts/generate-weights.sh 5 2 - # Show any changes in computed weights - git diff + ./scripts/generate-weights.sh 1 1 && git diff if: env.GIT_DIFF # Build and test joystream-node with all runtime profiles @@ -51,16 +53,16 @@ jobs: name: Runtime Profiles runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '14.x' - uses: technote-space/get-diff-action@v3 with: PREFIX_FILTER: | - node + bin + runtime runtime-modules - utils/chain-spec-builder SUFFIX_FILTER: | .rs FILES: | @@ -74,26 +76,23 @@ jobs: - name: Production Runtime run: | yarn cargo-checks && yarn cargo-build - ./target/release/joystream-node --version + ./target/release/call-sizes if: env.GIT_DIFF - name: Staging Runtime env: - RUNTIME_PROFILE: STAGING + RUNTIME_PROFILE: "STAGING" run: | yarn cargo-checks && yarn cargo-build - ./target/release/joystream-node --version if: env.GIT_DIFF - name: Playground Runtime env: - RUNTIME_PROFILE: PLAYGROUND + RUNTIME_PROFILE: "PLAYGROUND" run: | yarn cargo-checks && yarn cargo-build - ./target/release/joystream-node --version if: env.GIT_DIFF - name: Testing Runtime env: - RUNTIME_PROFILE: TESTING + RUNTIME_PROFILE: "TESTING" run: | yarn cargo-checks && yarn cargo-build - ./target/release/joystream-node --version if: env.GIT_DIFF diff --git a/.github/workflows/joystream-types.yml b/.github/workflows/joystream-types.yml index 44ef4f8294..c4a175154d 100644 --- a/.github/workflows/joystream-types.yml +++ b/.github/workflows/joystream-types.yml @@ -9,22 +9,21 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks run: | yarn install --frozen-lockfile yarn workspace @joystream/types build - yarn workspace @joystream/types checks --quiet - name: npm pack test run: | cd types npm pack | tail -1 | xargs tar xzf cd package && npm install - node ./index.js + node ./lib/cjs/index.js types_checks_osx: name: MacOS Checks @@ -33,19 +32,18 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks run: | yarn install --frozen-lockfile --network-timeout 120000 yarn workspace @joystream/types build - yarn workspace @joystream/types checks --quiet - name: npm pack test run: | cd types npm pack | tail -1 | xargs tar xzf cd package && npm install - node ./index.js + node ./lib/cjs/index.js diff --git a/.github/workflows/network-tests.yml b/.github/workflows/lint-typescript.yml similarity index 60% rename from .github/workflows/network-tests.yml rename to .github/workflows/lint-typescript.yml index 6f7236d2ce..b3837f0aa2 100644 --- a/.github/workflows/network-tests.yml +++ b/.github/workflows/lint-typescript.yml @@ -1,43 +1,41 @@ -name: network-tests +name: lint-typescript on: [pull_request, push] jobs: - network_build_ubuntu: + lint_ubuntu: name: Ubuntu Checks runs-on: ubuntu-latest strategy: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - name: checks + - name: lint run: | yarn install --frozen-lockfile yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/cli build - yarn workspace network-tests checks --quiet + yarn lint - network_build_osx: + lint_osx: name: MacOS Checks runs-on: macos-latest strategy: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - name: checks + - name: lint run: | - yarn install --frozen-lockfile --network-timeout 120000 + yarn install --frozen-lockfile yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/cli build - yarn workspace network-tests checks --quiet + yarn lint diff --git a/.github/workflows/metadata-protobuf.yml b/.github/workflows/metadata-protobuf.yml index 1454a405fd..d88474293b 100644 --- a/.github/workflows/metadata-protobuf.yml +++ b/.github/workflows/metadata-protobuf.yml @@ -9,14 +9,13 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: test protobuf run: | yarn install --frozen-lockfile yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/metadata-protobuf checks --quiet yarn workspace @joystream/metadata-protobuf test diff --git a/.github/workflows/query-node.yml b/.github/workflows/query-node.yml index ae726193aa..18c0b072fa 100644 --- a/.github/workflows/query-node.yml +++ b/.github/workflows/query-node.yml @@ -9,9 +9,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -20,7 +20,6 @@ jobs: yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build yarn workspace query-node-root build - yarn workspace query-node-mappings checks --quiet query_node_build_osx: name: MacOS Checks @@ -29,9 +28,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -40,4 +39,3 @@ jobs: yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build yarn workspace query-node-root build - yarn workspace query-node-mappings checks --quiet diff --git a/.github/workflows/run-network-tests.yml b/.github/workflows/run-network-tests.yml index 85ec9dff7d..c3beadad4e 100644 --- a/.github/workflows/run-network-tests.yml +++ b/.github/workflows/run-network-tests.yml @@ -4,26 +4,58 @@ on: types: [opened, synchronize] workflow_dispatch: - # TODO: add an input so dispatcher can specify a list of tests to run, - # composed of the job ids separated by `:` - # for eg. - # 'network_tests_1:network_tests_3' - # 'network_tests_2' - # inputs: - # test_to_run: - # description: 'Tests to run' - # required: false - # default: 'all' + push: jobs: + tests_build_ubuntu: + name: Ubuntu Checks + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: checks + run: | + yarn install --frozen-lockfile + yarn workspace @joystream/types build + yarn workspace @joystream/metadata-protobuf build + yarn workspace @joystream/cli build + yarn workspace network-tests build + + tests_build_osx: + name: MacOS Checks + runs-on: macos-latest + strategy: + matrix: + node-version: [14.x] + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + - name: checks + run: | + yarn install --frozen-lockfile --network-timeout 120000 + yarn workspace @joystream/types build + yarn workspace @joystream/metadata-protobuf build + yarn workspace @joystream/cli build + yarn workspace network-tests build + build_images: name: Build joystream/node + needs: tests_build_ubuntu runs-on: ubuntu-latest outputs: use_artifact: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '14.x' @@ -39,7 +71,7 @@ jobs: run: mkdir ~/docker-images - name: Cache docker images - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: joystream-node-docker with: @@ -65,35 +97,73 @@ jobs: cp joystream-node-docker-image.tar.gz ~/docker-images/ fi - - name: Build new joystream/node image + - name: Check we now have an image + id: check_files + uses: andstor/file-existence-action@v1 + with: + files: "joystream-node-docker-image.tar.gz" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@dc7b9719a96d48369863986a06765841d7ea23f6 # v1.7 + id: builder1 + if: steps.check_files.outputs.files_exists == 'false' + + - name: Cache Docker layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx + if: steps.check_files.outputs.files_exists == 'false' + + - name: Build + uses: docker/build-push-action@v3 + with: + context: . + file: joystream-node.Dockerfile + platforms: linux/amd64 + build-args: | + CARGO_FEATURES=testing-runtime + CODE_SHASUM=${{ steps.compute_shasum.outputs.shasum }} + push: false + tags: joystream/node + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + builder: ${{ steps.builder1.outputs.name }} + load: true + if: steps.check_files.outputs.files_exists == 'false' + + - name: Save joystream/node image to cache run: | - if ! [ -f joystream-node-docker-image.tar.gz ]; then - docker build .\ - --file joystream-node.Dockerfile\ - --tag joystream/node\ - --build-arg CARGO_FEATURES="testing_runtime" - docker save --output joystream-node-docker-image.tar joystream/node - gzip joystream-node-docker-image.tar - cp joystream-node-docker-image.tar.gz ~/docker-images/ - fi + docker save --output joystream-node-docker-image.tar joystream/node + gzip joystream-node-docker-image.tar + cp joystream-node-docker-image.tar.gz ~/docker-images/ + if: steps.check_files.outputs.files_exists == 'false' - name: Save joystream/node image to Artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz path: joystream-node-docker-image.tar.gz - basic_runtime: - name: Integration Tests (New Chain) + run_test_scenarios: + name: Tests needs: build_images runs-on: ubuntu-latest + strategy: + matrix: + scenario: ['full', 'setupNewChain', 'setupNewChainMultiStorage', 'bonding', 'carthageNPoSSwitch'] + include: + - scenario: 'setupNewChain' + no_storage: 'true' + - scenario: 'setupNewChainMultiStorage' + no_storage: 'true' steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '14.x' - name: Get artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ needs.build_images.outputs.use_artifact }} - name: Install artifacts @@ -111,19 +181,22 @@ jobs: - name: Execute network tests run: | export RUNTIME=latest - tests/network-tests/run-full-tests.sh + export NO_STORAGE=${{ matrix.no_storage }} + tests/network-tests/run-tests.sh ${{ matrix.scenario }} - new_chain_setup: - name: Initialize new chain + runtime_upgrade: + # Re-Enable when we want to test carthage runtime updates + if: ${{ false }} + name: Runtime Upgrade From Carthage Spec 0 needs: build_images runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: '14.x' - name: Get artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: ${{ needs.build_images.outputs.use_artifact }} - name: Install artifacts @@ -136,13 +209,14 @@ jobs: yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build yarn workspace @joystream/cli build - - name: Ensure query-node builds - run: yarn workspace query-node-root build - name: Ensure tests are runnable run: yarn workspace network-tests build - # Bring up hydra query-node development instance, then run content directory - # integration tests - - name: Execute Tests + - name: Execute network tests run: | - export RUNTIME=latest - tests/network-tests/test-setup-new-chain.sh + export HOME=${PWD} + mkdir -p ${HOME}/.local/share/joystream-cli + yarn joystream-cli api:setUri ws://localhost:9944 + # Rhodes release (spec 7) production runtime profile + export RUNTIME_TAG=e3f72ac0dbfc3d8dc69b63c2ab991f104411f205 + export TARGET_RUNTIME_TAG=latest + tests/network-tests/run-migration-tests.sh diff --git a/.github/workflows/runtime-upgrade.yml b/.github/workflows/runtime-upgrade.yml deleted file mode 100644 index f3996ebabf..0000000000 --- a/.github/workflows/runtime-upgrade.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: runtime-upgrade -on: - pull_request: - types: [opened, synchronize] - - workflow_dispatch: - -jobs: - build_images: - name: Build joystream/node - runs-on: ubuntu-latest - outputs: - use_artifact: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: '14.x' - - - id: compute_shasum - name: Compute runtime code shasum - run: | - export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh` - echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}" - - - name: Setup cache directory - run: mkdir ~/docker-images - - - name: Cache docker images - uses: actions/cache@v2 - env: - cache-name: joystream-node-docker - with: - path: ~/docker-images - key: ${{ env.cache-name }}-${{ steps.compute_shasum.outputs.shasum }} - - - name: Check if we have cached image - continue-on-error: true - run: | - if [ -f ~/docker-images/joystream-node-docker-image.tar.gz ]; then - docker load --input ~/docker-images/joystream-node-docker-image.tar.gz - cp ~/docker-images/joystream-node-docker-image.tar.gz . - fi - - - name: Check if we have pre-built image on Dockerhub - continue-on-error: true - run: | - if ! [ -f joystream-node-docker-image.tar.gz ]; then - docker pull joystream/node:${{ steps.compute_shasum.outputs.shasum }} - docker image tag joystream/node:${{ steps.compute_shasum.outputs.shasum }} joystream/node:latest - docker save --output joystream-node-docker-image.tar joystream/node:latest - gzip joystream-node-docker-image.tar - cp joystream-node-docker-image.tar.gz ~/docker-images/ - fi - - - name: Build new joystream/node image - run: | - if ! [ -f joystream-node-docker-image.tar.gz ]; then - docker build .\ - --file joystream-node.Dockerfile\ - --tag joystream/node\ - --build-arg CARGO_FEATURES="testing_runtime" - docker save --output joystream-node-docker-image.tar joystream/node - gzip joystream-node-docker-image.tar - cp joystream-node-docker-image.tar.gz ~/docker-images/ - fi - - - name: Save joystream/node image to Artifacts - uses: actions/upload-artifact@v2 - with: - name: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz - path: joystream-node-docker-image.tar.gz - - runtime_upgrade_from_olympia: - # if: ${{ false }} - name: Runtime Upgrade From Olypia - needs: build_images - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: '14.x' - - name: Get artifacts - uses: actions/download-artifact@v2 - with: - name: ${{ needs.build_images.outputs.use_artifact }} - - name: Install artifacts - run: | - docker load --input joystream-node-docker-image.tar.gz - docker images - - name: Install packages and dependencies - run: | - yarn install --frozen-lockfile - yarn workspace @joystream/types build - yarn workspace @joystream/metadata-protobuf build - yarn workspace @joystream/cli build - - name: Ensure tests are runnable - run: yarn workspace network-tests build - - name: Execute network tests - run: | - export HOME=${PWD} - mkdir -p ${HOME}/.local/share/joystream-cli - yarn joystream-cli api:setUri ws://localhost:9944 - # Olympia release production runtime profile - export RUNTIME_TAG=6740a4ae2bf40fe7c670fb49943cbbe290277601 - export TARGET_RUNTIME_TAG=latest - tests/network-tests/run-migration-tests.sh \ No newline at end of file diff --git a/.github/workflows/storage-node.yml b/.github/workflows/storage-node.yml index 14e4403e3c..939012b141 100644 --- a/.github/workflows/storage-node.yml +++ b/.github/workflows/storage-node.yml @@ -9,9 +9,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -19,7 +19,6 @@ jobs: yarn install --frozen-lockfile yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace storage-node lint --quiet yarn workspace storage-node build storage_node_build_osx: @@ -29,9 +28,9 @@ jobs: matrix: node-version: [14.x] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: checks @@ -39,5 +38,4 @@ jobs: yarn install --frozen-lockfile --network-timeout 120000 yarn workspace @joystream/types build yarn workspace @joystream/metadata-protobuf build - yarn workspace storage-node lint --quiet yarn workspace storage-node build diff --git a/.pipelines/deploy-node-network-inputs.json b/.pipelines/deploy-node-network-inputs.json index 2c4774a964..bfa595b484 100644 --- a/.pipelines/deploy-node-network-inputs.json +++ b/.pipelines/deploy-node-network-inputs.json @@ -5,62 +5,42 @@ }, "branchName": { "description": "Branch to deploy", - "value": "master" + "value": "carthage" }, - "numberOfValidators": { - "description": "Number of validators to deploy", - "value": "2" - }, - "validatorInstanceType": { - "description": "AWS EC2 instance type for Validators (t2.micro, t2.large)", - "value": "t2.micro" - }, - "buildInstanceType": { - "description": "AWS EC2 instance type for Build Instance (t2.micro, t2.large)", + "instanceType": { + "description": "AWS EC2 instance type for Validators and Rpc (t2.micro, t2.large, t2.xlarge)", "value": "t2.large" }, - "rpcInstanceType": { - "description": "AWS EC2 instance type for RPC (t2.micro, t2.large)", - "value": "t2.micro" - }, - "ec2AMI": { - "description": "Pre-built AMI ID", - "value": "ami-0ce5f13e91397239a" - }, "volumeSize": { - "description": "Validator and Build instance volume size in GB", - "value": "120" + "description": "Instances volume size in GB", + "value": "200" }, - "rpcVolumeSize": { - "description": "RPC Instance volume size in GB", - "value": "120" + "networkName": { + "description": "Chain network name displayed in telemetry", + "value": "Joystream Testnet 123" }, - "networkSuffix": { - "description": "Network suffix that will be added to the network name", - "value": "8129" + "networkId": { + "description": "Id used as chain-id and protocol-id in chainsepc config", + "value": "joystream_test_carthage_123" }, "initialBalancesFile": { "description": "HTTP Link to the Initial Balances file", "value": "" }, - "initialMembersFile": { - "description": "HTTP Link to the Initial Members file", - "value": "" - }, "deploymentType": { "description": "Chain deployment type (live, dev etc.)", - "value": "live" + "value": "staging" }, "encryptionKey": { "description": "Password to encrypt the artifacts", - "value": "password" + "value": "staging" }, "runtimeProfile": { - "description": "STAGING | PLAYGROUND| TESTING - leave empty for production", - "value": "" + "description": "STAGING | PLAYGROUND | TESTING - leave empty for production", + "value": "PLAYGROUND" }, - "skipChainSetup": { - "description": "Set to true to skip running setup new chain scenario", - "value": true + "endowAccounts": { + "description": "Number of accounts to endow", + "value": "1" } } diff --git a/Cargo.lock b/Cargo.lock index 232225bd6c..fdd90badd9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.15.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ "gimli", ] @@ -29,106 +29,66 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aead" -version = "0.3.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" dependencies = [ - "generic-array 0.14.4", + "generic-array 0.14.6", ] [[package]] name = "aes" -version = "0.5.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2bc6d3f370b5666245ff421e231cba4353df936e26986d2918e61a8fd6aef6" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ - "aes-soft", - "aesni", - "block-cipher", + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug 0.3.0", ] [[package]] name = "aes-gcm" -version = "0.7.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0301c9e9c443494d970a07885e8cf3e587bae8356a1d5abd0999068413f7205f" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" dependencies = [ "aead", "aes", - "block-cipher", + "cipher", + "ctr", "ghash", - "subtle 2.4.0", -] - -[[package]] -name = "aes-soft" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dd91889c49327ad7ef3b500fd1109dbd3c509a03db0d4a9ce413b79f575cb6" -dependencies = [ - "block-cipher", - "byteorder 1.4.3", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6fe808308bb07d393e2ea47780043ec47683fcf19cf5efc8ca51c50cc8c68a" -dependencies = [ - "block-cipher", - "opaque-debug 0.3.0", + "subtle", ] [[package]] name = "ahash" -version = "0.2.19" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29661b60bec623f0586702976ff4d0c9942dcb6723161c2df0eea78455cfedfb" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "const-random", + "getrandom 0.2.7", + "once_cell", + "version_check", ] -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" - -[[package]] -name = "ahash" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" - [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] [[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex", - "num-traits", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "winapi 0.3.9", + "libc", ] [[package]] @@ -137,30 +97,24 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] name = "anyhow" -version = "1.0.41" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" +checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" [[package]] name = "approx" -version = "0.3.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" dependencies = [ "num-traits", ] -[[package]] -name = "arc-swap" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e906254e445520903e7fc9da4f709886c84ae4bc4ddaf0e093188d66df4dc820" - [[package]] name = "arrayref" version = "0.3.6" @@ -182,20 +136,37 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "asn1_der" -version = "0.6.3" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" + +[[package]] +name = "assert_cmd" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" +checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e" dependencies = [ - "asn1_der_derive", + "bstr", + "doc-comment", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", ] [[package]] -name = "asn1_der_derive" -version = "0.1.2" +name = "async-attributes" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ "quote", "syn", @@ -203,9 +174,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +checksum = "e14485364214912d3b19cc3435dde4df66065127f05fa0d75c712f36f12c2f28" dependencies = [ "concurrent-queue", "event-listener", @@ -222,93 +193,85 @@ dependencies = [ "concurrent-queue", "fastrand", "futures-lite", - "once_cell 1.8.0", + "once_cell", "slab", ] [[package]] name = "async-global-executor" -version = "2.0.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9586ec52317f36de58453159d48351bc244bc24ced3effc1fce22f3d48664af6" +checksum = "0da5b41ee986eed3f524c380e6d64965aea573882a8907682ad100f7859305ca" dependencies = [ "async-channel", "async-executor", "async-io", - "async-mutex", + "async-lock", "blocking", "futures-lite", - "num_cpus", - "once_cell 1.8.0", + "once_cell", ] [[package]] name = "async-io" -version = "1.4.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bbfd5cf2794b1e908ea8457e6c45f8f8f1f6ec5f74617bf4662623f47503c3b" +checksum = "83e21f3a490c72b3b0cf44962180e60045de2925d8dff97918f7ee43c8f637c7" dependencies = [ + "autocfg", "concurrent-queue", - "fastrand", "futures-lite", "libc", "log", - "once_cell 1.8.0", + "once_cell", "parking", "polling", "slab", - "socket2 0.4.0", + "socket2", "waker-fn", - "winapi 0.3.9", + "winapi", ] [[package]] name = "async-lock" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-mutex" -version = "1.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" dependencies = [ "event-listener", ] [[package]] name = "async-process" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f38756dd9ac84671c428afbf7c9f7495feff9ec5b0710f17100098e5b354ac" +checksum = "02111fd8655a613c25069ea89fc8d9bb89331fa77486eb3bc059ee757cfa481c" dependencies = [ "async-io", + "autocfg", "blocking", - "cfg-if 1.0.0", + "cfg-if", "event-listener", "futures-lite", "libc", - "once_cell 1.8.0", + "once_cell", "signal-hook", - "winapi 0.3.9", + "winapi", ] [[package]] name = "async-std" -version = "1.9.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ + "async-attributes", "async-channel", "async-global-executor", "async-io", "async-lock", "async-process", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "futures-channel", "futures-core", "futures-io", @@ -317,37 +280,39 @@ dependencies = [ "kv-log-macro", "log", "memchr", - "num_cpus", - "once_cell 1.8.0", - "pin-project-lite 0.2.6", + "once_cell", + "pin-project-lite 0.2.9", "pin-utils", "slab", "wasm-bindgen-futures", ] [[package]] -name = "async-task" -version = "4.0.3" +name = "async-std-resolver" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" +checksum = "0f2f8a4a203be3325981310ab243a28e6e4ea55b6519bffce05d41ab60e09ad8" +dependencies = [ + "async-std", + "async-trait", + "futures-io", + "futures-util", + "pin-utils", + "socket2", + "trust-dns-resolver", +] [[package]] -name = "async-tls" -version = "0.8.0" +name = "async-task" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df097e3f506bec0e1a24f06bb3c962c228f36671de841ff579cb99f371772634" -dependencies = [ - "futures 0.3.15", - "rustls", - "webpki", - "webpki-roots 0.19.0", -] +checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" [[package]] name = "async-trait" -version = "0.1.50" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" +checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" dependencies = [ "proc-macro2", "quote", @@ -355,10 +320,17 @@ dependencies = [ ] [[package]] -name = "atomic" -version = "0.4.6" +name = "asynchronous-codec" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f46ca51dca4837f1520754d1c8c36636356b81553d928dc9c177025369a06e" +checksum = "f0de5164e5edbf51c45fb8c2d9664ae1c095cce1b265ecf7569093c0d66ef690" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite 0.2.9", +] [[package]] name = "atomic-waker" @@ -374,53 +346,91 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" - -[[package]] -name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" dependencies = [ "addr2line", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", - "object", + "object 0.29.0", "rustc-demangle", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base58" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" [[package]] name = "base64" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] -name = "base64" -version = "0.12.3" +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + +[[package]] +name = "beefy-primitives" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-application-crypto", + "sp-core", + "sp-runtime", + "sp-std", +] + +[[package]] +name = "bimap" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0455254eb5c6964c4545d8bac815e1a1be4f3afe0ae695ea539c12d728d44b" + +[[package]] +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] [[package]] name = "bindgen" @@ -441,52 +451,31 @@ dependencies = [ "shlex", ] -[[package]] -name = "bip39" -version = "0.6.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059804e226b3ac116519a252d7f5fb985a5ccc0e93255e036a5f7e7283323f4" -dependencies = [ - "failure", - "hashbrown 0.1.8", - "hmac", - "once_cell 0.1.8", - "pbkdf2", - "rand 0.6.5", - "sha2 0.8.2", -] - [[package]] name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "bitmask" -version = "0.5.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "0.17.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "either", + "funty", "radium", + "tap", + "wyz", ] [[package]] name = "blake2" -version = "0.9.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a5720225ef5daecf08657f23791354e1685a8c91a4c60c7f3d3b2892f978f4" +checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388" dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", + "digest 0.10.5", ] [[package]] @@ -501,23 +490,36 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "0.5.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec 0.7.2", "constant_time_eq", ] [[package]] name = "blake2s_simd" -version = "0.5.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +checksum = "db539cc2b5f6003621f1cd9ef92d7ded8ea5232c7de0f9faa2de251cd98730d4" dependencies = [ "arrayref", - "arrayvec 0.5.2", + "arrayvec 0.7.2", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "cc", + "cfg-if", "constant_time_eq", ] @@ -529,7 +531,7 @@ checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ "block-padding 0.1.5", "byte-tools", - "byteorder 1.4.3", + "byteorder", "generic-array 0.12.4", ] @@ -540,16 +542,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "block-padding 0.2.1", - "generic-array 0.14.4", + "generic-array 0.14.6", ] [[package]] -name = "block-cipher" -version = "0.8.0" +name = "block-buffer" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f337a3e6da609650eb74e02bc9fac7b735049f7623ab12f2e4c719316fcc7e80" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ - "generic-array 0.14.4", + "generic-array 0.14.6", ] [[package]] @@ -569,24 +571,18 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blocking" -version = "1.0.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" +checksum = "c6ccb65d468978a086b69884437ded69a90faab3bbe6e67f242173ea728acccc" dependencies = [ "async-channel", "async-task", "atomic-waker", "fastrand", "futures-lite", - "once_cell 1.8.0", + "once_cell", ] -[[package]] -name = "bs58" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" - [[package]] name = "bs58" version = "0.4.0" @@ -595,24 +591,36 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ + "lazy_static", "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "build-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdce191bf3fa4995ce948c8c83b4640a1745457a149e73c6db75b4ffe36aad5f" +dependencies = [ + "semver 0.6.0", ] [[package]] name = "bumpalo" -version = "3.7.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "byte-slice-cast" -version = "0.3.5" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" +checksum = "87c5fdd0166095e1d463fc6cc01aa8ce547ad77a4e84d42eb6762b084e28067e" [[package]] name = "byte-tools" @@ -620,12 +628,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" -[[package]] -name = "byteorder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" - [[package]] name = "byteorder" version = "1.4.3" @@ -634,44 +636,92 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "0.4.12" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" dependencies = [ - "byteorder 1.4.3", - "either", - "iovec", + "cc", + "libc", + "pkg-config", ] [[package]] -name = "bytes" -version = "0.5.6" +name = "cache-padded" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] -name = "bytes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +name = "call-sizes" +version = "1.0.0" +dependencies = [ + "joystream-node-runtime", + "pallet-bounty", + "pallet-common", + "pallet-constitution", + "pallet-content", + "pallet-council", + "pallet-forum", + "pallet-membership", + "pallet-project-token", + "pallet-proposals-codex", + "pallet-proposals-discussion", + "pallet-proposals-engine", + "pallet-referendum", + "pallet-staking-handler", + "pallet-storage", + "pallet-utility 2.0.0", + "pallet-working-group", +] [[package]] -name = "c_linked_list" +name = "camino" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" +checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" +dependencies = [ + "serde", +] [[package]] -name = "cache-padded" -version = "1.1.1" +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.14", + "serde", + "serde_json", +] + +[[package]] +name = "cast" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.68" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] @@ -685,12 +735,6 @@ dependencies = [ "nom", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -699,160 +743,210 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chacha20" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244fbce0d47e97e8ef2f63b81d5e05882cb518c68531eb33194990d7b7e85845" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" dependencies = [ - "stream-cipher", + "cfg-if", + "cipher", + "cpufeatures", "zeroize", ] [[package]] name = "chacha20poly1305" -version = "0.6.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bf18d374d66df0c05cdddd528a7db98f78c28e2519b120855c4f84c5027b1f5" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" dependencies = [ "aead", "chacha20", + "cipher", "poly1305", - "stream-cipher", "zeroize", ] [[package]] name = "chain-spec-builder" -version = "6.6.0" +version = "8.0.0" dependencies = [ - "ansi_term 0.12.1", + "async-std", + "clap 3.2.22", "enum-utils", + "futures-util", "joystream-node", - "rand 0.7.3", + "rand 0.8.5", "sc-chain-spec", "sc-keystore", "sc-telemetry", + "serde_json", "sp-core", - "structopt", + "sp-keystore", ] [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ + "iana-time-zone", "js-sys", - "libc", "num-integer", "num-traits", "time", "wasm-bindgen", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "cid" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" +dependencies = [ + "core2", + "multibase", + "multihash", + "serde", + "unsigned-varint", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array 0.14.6", ] [[package]] name = "clang-sys" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853eda514c284c2287f4bf20ae614f8781f40a81d32ecda6e91449304dfe077c" +checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" dependencies = [ "glob", "libc", - "libloading 0.7.0", + "libloading 0.7.3", ] [[package]] name = "clap" -version = "2.33.3" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ - "ansi_term 0.11.0", - "atty", "bitflags", - "strsim", - "textwrap", + "textwrap 0.11.0", "unicode-width", - "vec_map", ] [[package]] -name = "cloudabi" -version = "0.0.3" +name = "clap" +version = "3.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" dependencies = [ + "atty", "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "strsim", + "termcolor", + "textwrap 0.15.1", ] [[package]] -name = "concurrent-queue" -version = "1.2.2" +name = "clap_complete" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" dependencies = [ - "cache-padded", + "clap 3.2.22", ] [[package]] -name = "console_error_panic_hook" -version = "0.1.6" +name = "clap_derive" +version = "3.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" dependencies = [ - "cfg-if 0.1.10", - "wasm-bindgen", + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "console_log" -version = "0.1.2" +name = "clap_lex" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" dependencies = [ - "log", - "web-sys", + "os_str_bytes", ] [[package]] -name = "const-random" -version = "0.1.13" +name = "cmake" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f590d95d011aa80b063ffe3253422ed5aa462af4e9867d43ce8337562bac77c4" +checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" dependencies = [ - "const-random-macro", - "proc-macro-hack", + "cc", ] [[package]] -name = "const-random-macro" -version = "0.1.13" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615f6e27d000a2bffbc7f2f6a8669179378fa27ee4d0a509e985dfc0a7defb40" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "getrandom 0.2.3", - "lazy_static", - "proc-macro-hack", - "tiny-keccak", + "termcolor", + "unicode-width", ] [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "comfy-table" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "b103d85ca6e209388771bfb7aa6b68a7aeec4afbf6f0a0264bfbf50360e5212e" +dependencies = [ + "strum 0.23.0", + "strum_macros 0.23.1", + "unicode-width", +] [[package]] -name = "convert_case" -version = "0.4.0" +name = "concurrent-queue" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "core-foundation" -version = "0.7.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -860,329 +954,666 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.7.0" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[package]] +name = "cpp_demangle" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" +checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +dependencies = [ + "cfg-if", +] [[package]] name = "cpufeatures" -version = "0.1.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed00c67cb5d0a7d64a44f6ad2668db7e7530311dd53ea79bcd4fb022c64911c8" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ "libc", ] [[package]] -name = "cpuid-bool" -version = "0.2.0" +name = "cranelift-bforest" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +dependencies = [ + "cranelift-entity", +] [[package]] -name = "crc32fast" -version = "1.2.1" +name = "cranelift-codegen" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" dependencies = [ - "cfg-if 1.0.0", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli", + "log", + "regalloc", + "smallvec", + "target-lexicon", ] [[package]] -name = "crossbeam-channel" -version = "0.5.1" +name = "cranelift-codegen-meta" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "cranelift-codegen-shared", ] [[package]] -name = "crossbeam-deque" -version = "0.7.3" +name = "cranelift-codegen-shared" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" + +[[package]] +name = "cranelift-entity" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" dependencies = [ - "crossbeam-epoch 0.8.2", - "crossbeam-utils 0.7.2", - "maybe-uninit", + "serde", ] [[package]] -name = "crossbeam-deque" -version = "0.8.0" +name = "cranelift-frontend" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch 0.9.5", - "crossbeam-utils 0.8.5", + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", ] [[package]] -name = "crossbeam-epoch" -version = "0.8.2" +name = "cranelift-native" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +checksum = "501241b0cdf903412ec9075385ac9f2b1eb18a89044d1538e97fab603231f70c" dependencies = [ - "autocfg 1.0.1", - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "lazy_static", - "maybe-uninit", - "memoffset 0.5.6", - "scopeguard 1.1.0", + "cranelift-codegen", + "libc", + "target-lexicon", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.5" +name = "cranelift-wasm" +version = "0.82.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "16d9e4211bbc3268042a96dd4de5bd979cda22434991d035f5f8eacba987fad2" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", - "lazy_static", - "memoffset 0.6.4", - "scopeguard 1.1.0", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "itertools", + "log", + "smallvec", + "wasmparser", + "wasmtime-types", ] [[package]] -name = "crossbeam-queue" -version = "0.2.3" +name = "crc32fast" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", + "cfg-if", ] [[package]] -name = "crossbeam-utils" -version = "0.7.2" +name = "criterion" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ - "autocfg 1.0.1", - "cfg-if 0.1.10", + "atty", + "cast", + "clap 2.34.0", + "criterion-plot", + "csv", + "futures", + "itertools", "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", ] [[package]] -name = "crossbeam-utils" -version = "0.8.5" +name = "criterion-plot" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" dependencies = [ - "cfg-if 1.0.0", - "lazy_static", + "cast", + "itertools", ] [[package]] -name = "crunchy" -version = "0.2.2" +name = "crossbeam-channel" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] [[package]] -name = "crypto-mac" -version = "0.7.0" +name = "crossbeam-deque" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ - "generic-array 0.12.4", - "subtle 1.0.0", + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "crossbeam-epoch" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" dependencies = [ - "generic-array 0.14.4", - "subtle 2.4.0", + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", ] [[package]] -name = "ct-logs" -version = "0.7.0" +name = "crossbeam-utils" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c8e13110a84b6315df212c045be706af261fd364791cad863285439ebba672e" +checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" dependencies = [ - "sct", + "cfg-if", ] [[package]] -name = "ctor" -version = "0.1.20" +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" dependencies = [ - "quote", - "syn", + "generic-array 0.14.6", + "rand_core 0.6.4", + "subtle", + "zeroize", ] [[package]] -name = "cuckoofilter" -version = "0.3.2" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "byteorder 0.5.3", - "rand 0.3.23", + "generic-array 0.14.6", + "typenum", ] [[package]] -name = "curve25519-dalek" -version = "2.1.2" +name = "crypto-mac" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434e1720189a637d44fe464f4df1e6eb900b4835255b14354497c78af37d9bb8" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "byteorder 1.4.3", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.4.0", - "zeroize", + "generic-array 0.14.6", + "subtle", ] [[package]] -name = "curve25519-dalek" -version = "3.1.0" +name = "crypto-mac" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639891fde0dbea823fc3d798a0fdf9d2f9440a42d64a78ab3488b0ca025117b3" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ - "byteorder 1.4.3", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle 2.4.0", - "zeroize", + "generic-array 0.14.6", + "subtle", ] [[package]] -name = "data-encoding" -version = "2.3.2" +name = "csv" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa 0.4.8", + "ryu", + "serde", +] [[package]] -name = "derive_more" -version = "0.99.13" +name = "csv-core" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b1b72f1263f214c0f823371768776c4f5841b942c9883aa8e5ec584fd0ba6" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" dependencies = [ - "convert_case", - "proc-macro2", "quote", "syn", ] [[package]] -name = "digest" -version = "0.8.1" +name = "ctr" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "generic-array 0.12.4", + "cipher", ] [[package]] -name = "digest" -version = "0.9.0" +name = "cuckoofilter" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "b810a8449931679f64cd7eef1bbd0fa315801b6d5d9cdc1ace2804d6529eee18" dependencies = [ - "generic-array 0.14.4", + "byteorder", + "fnv", + "rand 0.7.3", ] [[package]] -name = "directories" -version = "2.0.2" +name = "curve25519-dalek" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" +checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", + "byteorder", + "digest 0.8.1", + "rand_core 0.5.1", + "subtle", + "zeroize", ] [[package]] -name = "dirs-sys" -version = "0.3.6" +name = "curve25519-dalek" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", ] [[package]] -name = "dns-parser" -version = "0.8.0" +name = "curve25519-dalek" +version = "4.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" +checksum = "4033478fbf70d6acf2655ac70da91ee65852d69daf7a67bf7a2f518fb47aafcf" dependencies = [ - "byteorder 1.4.3", - "quick-error", + "byteorder", + "digest 0.9.0", + "rand_core 0.6.4", + "subtle", + "zeroize", ] [[package]] -name = "dyn-clonable" -version = "0.9.0" +name = "cxx" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4" dependencies = [ - "dyn-clonable-impl", - "dyn-clone", + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", ] [[package]] -name = "dyn-clonable-impl" -version = "0.9.0" +name = "cxx-build" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199" dependencies = [ + "cc", + "codespan-reporting", + "once_cell", "proc-macro2", "quote", + "scratch", "syn", ] [[package]] -name = "dyn-clone" -version = "1.0.4" +name = "cxxbridge-flags" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2626afccd7561a06cf1367e2950c4718ea04565e20fb5029b6c7d8ad09abcf" +checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c" [[package]] -name = "ed25519" -version = "1.1.1" +name = "cxxbridge-macro" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d0860415b12243916284c67a9be413e044ee6668247b99ba26d94b2bc06c8f6" +checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea" dependencies = [ - "signature", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "ed25519-dalek" +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn", +] + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "derive-fixture" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive-new" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.6", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer 0.10.3", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dns-parser" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" +dependencies = [ + "byteorder", + "quick-error", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "dtoa" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6eee2d5d0d113f015688310da018bd1d864d86bd567c8fca9c266889e1bfa" + +[[package]] +name = "dyn-clonable" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" +dependencies = [ + "dyn-clonable-impl", + "dyn-clone", +] + +[[package]] +name = "dyn-clonable-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dyn-clone" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f94fa09c2aeea5b8839e414b7b841bf429fd25b9c522116ac97ee87856d88b2" + +[[package]] +name = "ecdsa" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "ed25519" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek 3.1.0", + "curve25519-dalek 3.2.0", "ed25519", "rand 0.7.3", "serde", - "sha2 0.9.5", + "sha2 0.9.9", "zeroize", ] [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "elliptic-curve" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "ff", + "generic-array 0.14.6", + "group", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-as-inner" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +dependencies = [ + "heck 0.4.0", + "proc-macro2", + "quote", + "syn", +] [[package]] name = "enum-utils" @@ -1208,6 +1639,19 @@ dependencies = [ "quote", ] +[[package]] +name = "env_logger" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "environmental" version = "1.1.3" @@ -1215,19 +1659,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68b91989ae21441195d7d9b9993a2f9295c7e1a8c96255d8b729accddc124797" [[package]] -name = "erased-serde" -version = "0.3.15" +name = "errno" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b36e6f2295f393f44894c6031f67df4d185b984cd54d08f768ce678007efcd" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" dependencies = [ - "serde", + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", ] [[package]] name = "event-listener" -version = "2.5.1" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "exit-future" @@ -1235,7 +1691,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.15", + "futures", ] [[package]] @@ -1245,19 +1701,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", ] [[package]] @@ -1266,11 +1709,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + [[package]] name = "fastrand" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" dependencies = [ "instant", ] @@ -1284,48 +1733,67 @@ dependencies = [ "libc", ] +[[package]] +name = "ff" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "131655483be284720a17d74ff97592b8e76576dc25563148601df2d7c9080924" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "file-per-thread-logger" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e16290574b39ee41c71aeb90ae960c504ebaf1e2a1c87bd52aa56ed6e1a02f" +dependencies = [ + "env_logger", + "log", +] + [[package]] name = "finality-grandpa" -version = "0.12.3" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" +checksum = "d9def033d8505edf199f6a5d07aa7e6d2d6185b164293b77f0efd108f4f3e11d" dependencies = [ "either", - "futures 0.3.15", - "futures-timer 2.0.2", + "futures", + "futures-timer", "log", "num-traits", "parity-scale-codec", - "parking_lot 0.9.0", + "parking_lot 0.11.2", + "scale-info", ] [[package]] name = "fixed-hash" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" dependencies = [ - "byteorder 1.4.3", - "rand 0.7.3", + "byteorder", + "rand 0.8.5", "rustc-hex", "static_assertions", ] [[package]] name = "fixedbitset" -version = "0.2.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.20" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", "libz-sys", "miniz_oxide", ] @@ -1338,33 +1806,36 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fork-tree" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "3.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", ] [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", - "percent-encoding 2.1.0", + "percent-encoding", ] [[package]] name = "frame-benchmarking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "linregress", + "log", "parity-scale-codec", - "paste", + "paste 1.0.9", + "scale-info", + "serde", "sp-api", + "sp-application-crypto", "sp-io", "sp-runtime", "sp-runtime-interface", @@ -1374,31 +1845,90 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "Inflector", + "chrono", + "clap 3.2.22", + "comfy-table", "frame-benchmarking", + "frame-support", + "frame-system", + "handlebars", + "hash-db", + "hex", + "itertools", + "kvdb", + "lazy_static", + "linked-hash-map", + "log", + "memory-db", "parity-scale-codec", + "rand 0.8.5", + "rand_pcg 0.3.1", + "sc-block-builder", "sc-cli", + "sc-client-api", "sc-client-db", "sc-executor", "sc-service", + "sc-sysinfo", + "serde", + "serde_json", + "serde_nanos", + "sp-api", + "sp-blockchain", "sp-core", + "sp-database", "sp-externalities", + "sp-inherents", + "sp-keystore", "sp-runtime", "sp-state-machine", - "structopt", + "sp-storage", + "sp-trie", + "tempfile", + "thiserror", + "thousands", +] + +[[package]] +name = "frame-election-provider-solution-type" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "frame-election-provider-support" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "frame-election-provider-solution-type", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-arithmetic", + "sp-npos-elections", + "sp-runtime", + "sp-std", ] [[package]] name = "frame-executive" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", - "serde", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -1408,45 +1938,52 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "12.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "15.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" dependencies = [ + "cfg-if", "parity-scale-codec", + "scale-info", "serde", - "sp-core", - "sp-std", ] [[package]] name = "frame-support" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "bitmask", + "bitflags", "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", + "k256", "log", - "once_cell 1.8.0", + "once_cell", "parity-scale-codec", - "paste", + "paste 1.0.9", + "scale-info", "serde", - "smallvec 1.6.1", + "smallvec", "sp-arithmetic", "sp-core", + "sp-core-hashing-proc-macro", "sp-inherents", "sp-io", "sp-runtime", + "sp-staking", "sp-state-machine", "sp-std", "sp-tracing", + "tt-call", ] [[package]] name = "frame-support-procedural" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "Inflector", "frame-support-procedural-tools", "proc-macro2", "quote", @@ -1455,8 +1992,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1467,8 +2004,8 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "3.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "proc-macro2", "quote", @@ -1477,12 +2014,13 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", - "impl-trait-for-tuples", + "log", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -1493,13 +2031,14 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", + "scale-info", "sp-core", "sp-runtime", "sp-std", @@ -1507,8 +2046,8 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", "sp-api", @@ -1523,42 +2062,36 @@ dependencies = [ "lazy_static", "libc", "libloading 0.5.2", - "winapi 0.3.9", + "winapi", ] [[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" +name = "fs2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "libc", + "winapi", ] [[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" +name = "fs_extra" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" [[package]] -name = "futures" -version = "0.1.31" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" +checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" dependencies = [ "futures-channel", "futures-core", @@ -1571,66 +2104,25 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" dependencies = [ "futures-core", "futures-sink", ] -[[package]] -name = "futures-channel-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" -dependencies = [ - "futures-core-preview", -] - [[package]] name = "futures-core" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" - -[[package]] -name = "futures-core-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" - -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -dependencies = [ - "futures 0.1.31", - "num_cpus", -] - -[[package]] -name = "futures-diagnose" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" -dependencies = [ - "futures 0.1.31", - "futures 0.3.15", - "lazy_static", - "log", - "parking_lot 0.9.0", - "pin-project 0.4.28", - "serde", - "serde_json", -] +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" [[package]] name = "futures-executor" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "badaa6a909fac9e7236d0620a2f57f7664640c56575b71a7552fbd68deafab79" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" dependencies = [ "futures-core", "futures-task", @@ -1640,9 +2132,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" [[package]] name = "futures-lite" @@ -1655,59 +2147,56 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.6", + "pin-project-lite 0.2.9", "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121" +checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" dependencies = [ - "autocfg 1.0.1", - "proc-macro-hack", "proc-macro2", "quote", "syn", ] [[package]] -name = "futures-sink" -version = "0.3.15" +name = "futures-rustls" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls", + "webpki", +] [[package]] -name = "futures-task" -version = "0.3.15" +name = "futures-sink" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" [[package]] -name = "futures-timer" -version = "2.0.2" +name = "futures-task" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" [[package]] name = "futures-timer" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] [[package]] name = "futures-util" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" dependencies = [ - "autocfg 1.0.1", - "futures 0.1.31", "futures-channel", "futures-core", "futures-io", @@ -1715,43 +2204,11 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.6", - "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", -] - -[[package]] -name = "futures-util-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" -dependencies = [ - "futures-channel-preview", - "futures-core-preview", + "pin-project-lite 0.2.9", "pin-utils", "slab", ] -[[package]] -name = "futures_codec" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce54d63f8b0c75023ed920d46fd71d0cbbb830b0ee012726b5b4f506fb6dea5b" -dependencies = [ - "bytes 0.5.6", - "futures 0.3.15", - "memchr", - "pin-project 0.4.28", -] - -[[package]] -name = "gcc" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - [[package]] name = "generic-array" version = "0.12.4" @@ -1763,34 +2220,12 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", - "version_check", -] - -[[package]] -name = "get_if_addrs" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" -dependencies = [ - "c_linked_list", - "get_if_addrs-sys", - "libc", - "winapi 0.2.8", -] - -[[package]] -name = "get_if_addrs-sys" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" -dependencies = [ - "gcc", - "libc", + "version_check", ] [[package]] @@ -1799,7 +2234,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", @@ -1808,20 +2243,22 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", + "js-sys", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] name = "ghash" -version = "0.3.1" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" dependencies = [ "opaque-debug 0.3.0", "polyval", @@ -1829,9 +2266,14 @@ dependencies = [ [[package]] name = "gimli" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] [[package]] name = "glob" @@ -1841,9 +2283,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0fc1b9fa0e64ffb1aa5b95daa0f0f167734fd528b7c02eabc581d9d843649b1" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -1854,107 +2296,88 @@ dependencies = [ [[package]] name = "gloo-timers" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f" +checksum = "5fb7d06c1c8cc2a29bee7ec961009a0b2caa0793ee4900c2ffb348734ba1c8f9" dependencies = [ "futures-channel", "futures-core", "js-sys", "wasm-bindgen", - "web-sys", ] [[package]] -name = "h2" -version = "0.1.26" +name = "group" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +checksum = "bc5ac374b108929de78460075f3dc439fa66df9d8fc77e8f12caa5165fcf0c89" dependencies = [ - "byteorder 1.4.3", - "bytes 0.4.12", - "fnv", - "futures 0.1.31", - "http 0.1.21", - "indexmap", - "log", - "slab", - "string", - "tokio-io", + "ff", + "rand_core 0.6.4", + "subtle", ] [[package]] name = "h2" -version = "0.2.7" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.4", + "http", "indexmap", "slab", - "tokio 0.2.25", + "tokio", "tokio-util", "tracing", - "tracing-futures", ] [[package]] -name = "hash-db" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" +name = "half" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -dependencies = [ - "crunchy", -] +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] -name = "hashbrown" -version = "0.1.8" +name = "handlebars" +version = "4.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" +checksum = "433e4ab33f1213cdc25b5fa45c76881240cfe79284cf2b395e8b9e312a30a2fd" dependencies = [ - "byteorder 1.4.3", - "scopeguard 0.3.3", + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", ] [[package]] -name = "hashbrown" -version = "0.6.3" +name = "hash-db" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" -dependencies = [ - "ahash 0.2.19", - "autocfg 0.1.7", -] +checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" [[package]] -name = "hashbrown" -version = "0.8.2" +name = "hash256-std-hasher" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" +checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" dependencies = [ - "ahash 0.3.8", - "autocfg 1.0.1", + "crunchy", ] [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.4.7", + "ahash", ] [[package]] @@ -1966,11 +2389,17 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -1983,9 +2412,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-literal" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8" +checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] name = "hex_fmt" @@ -1995,158 +2424,154 @@ checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" [[package]] name = "hmac" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac 0.7.0", - "digest 0.8.1", + "crypto-mac 0.8.0", + "digest 0.9.0", ] [[package]] -name = "hmac-drbg" -version = "0.2.0" +name = "hmac" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "digest 0.8.1", - "generic-array 0.12.4", - "hmac", + "crypto-mac 0.11.1", + "digest 0.9.0", ] [[package]] -name = "http" -version = "0.1.21" +name = "hmac-drbg" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa", + "digest 0.9.0", + "generic-array 0.14.6", + "hmac 0.8.1", ] [[package]] -name = "http" -version = "0.2.4" +name = "hostname" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ - "bytes 1.0.1", - "fnv", - "itoa", + "libc", + "match_cfg", + "winapi", ] [[package]] -name = "http-body" -version = "0.1.0" +name = "http" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "http 0.1.21", - "tokio-buf", + "bytes", + "fnv", + "itoa 1.0.4", ] [[package]] name = "http-body" -version = "0.3.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 0.5.6", - "http 0.2.4", + "bytes", + "http", + "pin-project-lite 0.2.9", ] [[package]] name = "httparse" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] -name = "hyper" -version = "0.12.36" +name = "humantime" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "futures-cpupool", - "h2 0.1.26", - "http 0.1.21", - "http-body 0.1.0", - "httparse", - "iovec", - "itoa", - "log", - "net2", - "rustc_version", - "time", - "tokio 0.1.22", - "tokio-buf", - "tokio-executor 0.1.10", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "want 0.2.0", -] +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.13.10" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6f157065790a3ed2f88679250419b5cdd96e714a0d65f7797fd337186e96bb" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-channel", "futures-core", "futures-util", - "h2 0.2.7", - "http 0.2.4", - "http-body 0.3.1", + "h2", + "http", + "http-body", "httparse", "httpdate", - "itoa", - "pin-project 1.0.7", - "socket2 0.3.19", - "tokio 0.2.25", + "itoa 1.0.4", + "pin-project-lite 0.2.9", + "socket2", + "tokio", "tower-service", "tracing", - "want 0.3.0", + "want", ] [[package]] name = "hyper-rustls" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" +checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ - "bytes 0.5.6", - "ct-logs", - "futures-util", - "hyper 0.13.10", + "http", + "hyper", "log", "rustls", "rustls-native-certs", - "tokio 0.2.25", + "tokio", "tokio-rustls", - "webpki", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa" +dependencies = [ + "cxx", + "cxx-build", ] [[package]] name = "idna" -version = "0.1.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -2155,20 +2580,47 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015a7df1eb6dda30df37f34b63ada9b7b352984b0e84de2a20ed526345000791" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "windows", +] + [[package]] name = "impl-codec" -version = "0.4.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ "parity-scale-codec", ] @@ -2184,9 +2636,9 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.1.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", @@ -2195,21 +2647,22 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.6.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ - "autocfg 1.0.1", - "hashbrown 0.9.1", + "autocfg", + "hashbrown", + "serde", ] [[package]] name = "instant" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2222,86 +2675,112 @@ dependencies = [ ] [[package]] -name = "intervalier" -version = "0.4.0" +name = "io-lifetimes" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" -dependencies = [ - "futures 0.3.15", - "futures-timer 2.0.2", -] +checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" [[package]] -name = "iovec" -version = "0.1.4" +name = "ip_network" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] +checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1" [[package]] -name = "ip_network" -version = "0.3.4" +name = "ipconfig" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee15951c035f79eddbef745611ec962f63f4558f1dadf98ab723cc603487c6f" +checksum = "723519edce41262b05d4143ceb95050e4c614f483e78e9fd9e39a8275a84ad98" +dependencies = [ + "socket2", + "widestring", + "winapi", + "winreg", +] [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itertools" -version = "0.8.2" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" [[package]] name = "jobserver" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972f5ae5d1cb9c6ae417789196c803205313edde988685da5e3aae0827b9e7fd" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" dependencies = [ "libc", ] [[package]] name = "joystream-node" -version = "6.6.0" +version = "8.0.0" dependencies = [ + "assert_cmd", + "async-std", + "clap 3.2.22", + "clap_complete", + "criterion", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", - "futures 0.3.15", + "frame-system-rpc-runtime-api", + "futures", "hex", + "hex-literal", "joystream-node-runtime", - "jsonrpc-core", + "jsonrpsee", + "log", + "nix 0.23.1", "node-inspect", - "pallet-grandpa", + "overrides", + "pallet-balances", "pallet-im-online", + "pallet-staking", + "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc", + "pallet-transaction-storage", "parity-scale-codec", + "platforms", + "rand 0.8.5", + "regex", + "remote-externalities", "sc-authority-discovery", "sc-basic-authorship", + "sc-block-builder", "sc-chain-spec", "sc-cli", "sc-client-api", + "sc-client-db", "sc-consensus", "sc-consensus-babe", "sc-consensus-babe-rpc", "sc-consensus-epochs", + "sc-consensus-slots", + "sc-consensus-uncles", "sc-executor", "sc-finality-grandpa", "sc-finality-grandpa-rpc", @@ -2311,62 +2790,78 @@ dependencies = [ "sc-rpc-api", "sc-service", "sc-service-test", + "sc-sync-state-rpc", + "sc-sysinfo", + "sc-telemetry", "sc-transaction-pool", + "sc-transaction-pool-api", "serde", "serde_json", + "soketto", "sp-api", "sp-authority-discovery", + "sp-authorship", "sp-block-builder", "sp-blockchain", "sp-consensus", "sp-consensus-babe", "sp-core", "sp-finality-grandpa", - "sp-finality-tracker", "sp-inherents", "sp-keyring", + "sp-keystore", "sp-runtime", "sp-timestamp", + "sp-tracing", "sp-transaction-pool", - "structopt", - "substrate-browser-utils", + "sp-transaction-storage-proof", + "sp-trie", "substrate-build-script-utils", + "substrate-frame-cli", "substrate-frame-rpc-system", + "substrate-state-trie-migration-rpc", "tempfile", - "wasm-bindgen", - "wasm-bindgen-futures", + "tokio", + "wait-timeout", ] [[package]] name = "joystream-node-runtime" -version = "10.6.0" +version = "12.1000.0" dependencies = [ "frame-benchmarking", + "frame-election-provider-support", "frame-executive", "frame-support", "frame-system", "frame-system-benchmarking", "frame-system-rpc-runtime-api", + "getrandom 0.2.7", "hex-literal", + "impl-serde", "lazy_static", "lite-json", + "log", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", + "pallet-bags-list", "pallet-balances", - "pallet-blog", "pallet-bounty", "pallet-common", "pallet-constitution", "pallet-content", "pallet-council", - "pallet-finality-tracker", + "pallet-election-provider-multi-phase", + "pallet-election-provider-support-benchmarking", "pallet-forum", "pallet-grandpa", "pallet-im-online", "pallet-membership", + "pallet-multisig", "pallet-offences", "pallet-offences-benchmarking", + "pallet-project-token", "pallet-proposals-codex", "pallet-proposals-discussion", "pallet-proposals-engine", @@ -2382,12 +2877,14 @@ dependencies = [ "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", - "pallet-utility 1.1.0", - "pallet-utility 2.0.1", + "pallet-utility 2.0.0", + "pallet-utility 4.0.0-dev", + "pallet-vesting", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", - "smallvec 1.6.1", + "smallvec", "sp-api", "sp-application-crypto", "sp-arithmetic", @@ -2403,62 +2900,107 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "static_assertions", "strum 0.19.5", - "substrate-wasm-builder-runner", + "substrate-wasm-builder", ] [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" dependencies = [ "wasm-bindgen", ] [[package]] -name = "jsonrpc-client-transports" -version = "15.1.0" +name = "jsonrpsee" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489b9c612e60c766f751ab40fcb43cbb55a1e10bb44a9b4307ed510ca598cbd7" +checksum = "a1f2ab5a60e558e74ea93bcf5164ebc47939a7fff8938fa9b5233bbc63e16061" dependencies = [ - "failure", - "futures 0.1.31", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "serde", - "serde_json", - "url 1.7.2", + "jsonrpsee-core", + "jsonrpsee-http-server", + "jsonrpsee-proc-macros", + "jsonrpsee-types", + "jsonrpsee-ws-client", + "jsonrpsee-ws-server", + "tracing", ] [[package]] -name = "jsonrpc-core" -version = "15.1.0" +name = "jsonrpsee-client-transport" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0745a6379e3edc893c84ec203589790774e4247420033e71a76d3ab4687991fa" +checksum = "26d682f4a55081a2be3e639280c640523070e4aeb8ee2fd8dd9168fdae57a9db" dependencies = [ - "futures 0.1.31", - "log", + "futures-util", + "http", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project 1.0.12", + "rustls-native-certs", + "soketto", + "thiserror", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "webpki-roots", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e27462b21279edf9a6a91f46ffbe125e9cdc58b901d2e08bf59b31a47d7d0ab" +dependencies = [ + "anyhow", + "arrayvec 0.7.2", + "async-lock", + "async-trait", + "beef", + "futures-channel", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", "serde", - "serde_derive", "serde_json", + "soketto", + "thiserror", + "tokio", + "tracing", ] [[package]] -name = "jsonrpc-core-client" -version = "15.1.0" +name = "jsonrpsee-http-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f764902d7b891344a0acb65625f32f6f7c6db006952143bd650209fbe7d94db" +checksum = "7178f16eabd7154c094e24d295b9ee355ec1e5f24c328759c56255ff7bbd4548" dependencies = [ - "jsonrpc-client-transports", + "futures-channel", + "futures-util", + "globset", + "hyper", + "jsonrpsee-core", + "jsonrpsee-types", + "lazy_static", + "serde_json", + "tokio", + "tracing", + "unicase", ] [[package]] -name = "jsonrpc-derive" -version = "15.1.0" +name = "jsonrpsee-proc-macros" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a847f9ec7bb52149b2786a17c9cb260d6effc6b8eeb8c16b343a487a7563a3" +checksum = "8b8d7f449cab3b747f12c3efc27f5cad537f3b597c6a3838b0fac628f4bf730a" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2467,92 +3009,64 @@ dependencies = [ ] [[package]] -name = "jsonrpc-http-server" -version = "15.1.0" +name = "jsonrpsee-types" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb5c4513b7b542f42da107942b7b759f27120b5cc894729f88254b28dff44b7" +checksum = "8fd11763134104122ddeb0f97e4bbe393058017dfb077db63fbf44b4dd0dd86e" dependencies = [ - "hyper 0.12.36", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.10.2", - "unicase", -] - -[[package]] -name = "jsonrpc-ipc-server" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf50e53e4eea8f421a7316c5f63e395f7bc7c4e786a6dc54d76fab6ff7aa7ce7" -dependencies = [ - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot 0.10.2", - "tokio-service", + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", + "tracing", ] [[package]] -name = "jsonrpc-pubsub" -version = "15.1.0" +name = "jsonrpsee-ws-client" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639558e0604013be9787ae52f798506ae42bf4220fe587bdc5625871cc8b9c77" +checksum = "76f15180afb3761c7a3a32c0a8b680788176dcfdfe725b24c1758c90b1d1595b" dependencies = [ - "jsonrpc-core", - "log", - "parking_lot 0.10.2", - "rand 0.7.3", - "serde", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", ] [[package]] -name = "jsonrpc-server-utils" -version = "15.1.0" +name = "jsonrpsee-ws-server" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f1f3990650c033bd8f6bd46deac76d990f9bbfb5f8dc8c4767bf0a00392176" +checksum = "dfb6c21556c551582b56e4e8e6e6249b0bbdb69bb7fa39efe9b9a6b54af9f206" dependencies = [ - "bytes 0.4.12", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio 0.1.22", - "tokio-codec", - "unicase", + "futures-channel", + "futures-util", + "jsonrpsee-core", + "jsonrpsee-types", + "serde_json", + "soketto", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "jsonrpc-ws-server" -version = "15.1.0" +name = "k256" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6596fe75209b73a2a75ebe1dce4e60e03b88a2b25e8807b667597f6315150d22" +checksum = "19c3a5e0a0b8450278feda242592512e09f61c72e018b8cd5c859482802daf2d" dependencies = [ - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-ws", - "parking_lot 0.10.2", - "slab", + "cfg-if", + "ecdsa", + "elliptic-curve", + "sec1", ] [[package]] name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] +checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" [[package]] name = "kv-log-macro" @@ -2565,30 +3079,30 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.7.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0315ef2f688e33844400b31f11c263f2b3dc21d8b9355c6891c5f185fae43f9a" +checksum = "a301d8ecb7989d4a6e2c57a49baca77d353bdbf879909debe3f375fe25d61f86" dependencies = [ "parity-util-mem", - "smallvec 1.6.1", + "smallvec", ] [[package]] name = "kvdb-memorydb" -version = "0.7.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73de822b260a3bdfb889dbbb65bb2d473eee2253973d6fa4a5d149a2a4a7c66e" +checksum = "ece7e668abd21387aeb6628130a6f4c802787f014fa46bc83221448322250357" dependencies = [ "kvdb", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.12.1", ] [[package]] name = "kvdb-rocksdb" -version = "0.9.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44947dd392f09475af614d740fe0320b66d01cb5b977f664bbbb5e45a70ea4c1" +checksum = "ca7fbdfd71cd663dceb0faf3367a99f8cf724514933e9867cec4995b6027cbc1" dependencies = [ "fs-swap", "kvdb", @@ -2596,27 +3110,10 @@ dependencies = [ "num_cpus", "owning_ref", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "regex", "rocksdb", - "smallvec 1.6.1", -] - -[[package]] -name = "kvdb-web" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2701a1369d6ea4f1b9f606db46e5e2a4a8e47f22530a07823d653f85ab1f6c34" -dependencies = [ - "futures 0.3.15", - "js-sys", - "kvdb", - "kvdb-memorydb", - "log", - "parity-util-mem", - "send_wrapper 0.3.0", - "wasm-bindgen", - "web-sys", + "smallvec", ] [[package]] @@ -2636,9 +3133,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.97" +version = "0.2.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b8adadd720df158f4d70dfe7ccc6adb0472d7c55ca83445f6a5ab3e36f8fb6" +checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" [[package]] name = "libloading" @@ -2647,37 +3144,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" dependencies = [ "cc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "libloading" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", + "cfg-if", + "winapi", ] [[package]] name = "libm" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" +checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" [[package]] name = "libp2p" -version = "0.28.1" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571f5a4604c1a40d75651da141dfde29ad15329f537a779528803297d2220274" +checksum = "41726ee8f662563fafba2d2d484b14037cc8ecb8c953fbfc8439d4ce3a0a9029" dependencies = [ - "atomic", - "bytes 0.5.6", - "futures 0.3.15", + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.7", + "instant", "lazy_static", - "libp2p-core", - "libp2p-core-derive", + "libp2p-autonat", + "libp2p-core 0.33.0", "libp2p-deflate", "libp2p-dns", "libp2p-floodsub", @@ -2685,358 +3184,497 @@ dependencies = [ "libp2p-identify", "libp2p-kad", "libp2p-mdns", + "libp2p-metrics", "libp2p-mplex", "libp2p-noise", "libp2p-ping", "libp2p-plaintext", "libp2p-pnet", + "libp2p-relay", + "libp2p-rendezvous", "libp2p-request-response", "libp2p-swarm", + "libp2p-swarm-derive", "libp2p-tcp", "libp2p-uds", "libp2p-wasm-ext", "libp2p-websocket", "libp2p-yamux", - "multihash", - "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project 0.4.28", - "smallvec 1.6.1", - "wasm-timer", + "multiaddr", + "parking_lot 0.12.1", + "pin-project 1.0.12", + "rand 0.7.3", + "smallvec", +] + +[[package]] +name = "libp2p-autonat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d45945fd2f96c4b133c23d5c28a8b7fc8d7138e6dd8d5a8cd492dd384f888e3" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", + "libp2p-request-response", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", ] [[package]] name = "libp2p-core" -version = "0.22.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f13ba8c7df0768af2eb391696d562c7de88cc3a35122531aaa6a7d77754d25" +checksum = "db5b02602099fb75cb2d16f9ea860a320d6eb82ce41e95ab680912c454805cd5" dependencies = [ "asn1_der", - "bs58 0.3.1", + "bs58", "ed25519-dalek", "either", "fnv", - "futures 0.3.15", - "futures-timer 3.0.2", + "futures", + "futures-timer", + "instant", "lazy_static", - "libsecp256k1", "log", + "multiaddr", "multihash", "multistream-select", - "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project 0.4.28", - "prost", - "prost-build", - "rand 0.7.3", + "parking_lot 0.12.1", + "pin-project 1.0.12", + "prost 0.9.0", + "prost-build 0.9.0", + "rand 0.8.5", "ring", - "rw-stream-sink", - "sha2 0.8.2", - "smallvec 1.6.1", + "rw-stream-sink 0.2.1", + "sha2 0.10.6", + "smallvec", "thiserror", - "unsigned-varint 0.4.0", + "unsigned-varint", "void", "zeroize", ] [[package]] -name = "libp2p-core-derive" -version = "0.20.2" +name = "libp2p-core" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f753d9324cd3ec14bf04b8a8cd0d269c87f294153d6bf2a84497a63a5ad22213" +checksum = "42d46fca305dee6757022e2f5a4f6c023315084d0ed7441c3ab244e76666d979" dependencies = [ - "quote", - "syn", + "asn1_der", + "bs58", + "ed25519-dalek", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "lazy_static", + "libsecp256k1", + "log", + "multiaddr", + "multihash", + "multistream-select", + "parking_lot 0.12.1", + "pin-project 1.0.12", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "ring", + "rw-stream-sink 0.3.0", + "sha2 0.10.6", + "smallvec", + "thiserror", + "unsigned-varint", + "void", + "zeroize", ] [[package]] name = "libp2p-deflate" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74029ae187f35f4b8ddf26b9779a68b340045d708528a103917cdca49a296db5" +checksum = "86adefc55ea4ed8201149f052fb441210727481dff1fb0b8318460206a79f5fb" dependencies = [ "flate2", - "futures 0.3.15", - "libp2p-core", + "futures", + "libp2p-core 0.33.0", ] [[package]] name = "libp2p-dns" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf319822e08dd65c8e060d2354e9f952895bbc433f5706c75ed010c152aee5e" +checksum = "fbb462ec3a51fab457b4b44ac295e8b0a4b04dc175127e615cf996b1f0f1a268" dependencies = [ - "futures 0.3.15", - "libp2p-core", + "async-std-resolver", + "futures", + "libp2p-core 0.33.0", "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", ] [[package]] name = "libp2p-floodsub" -version = "0.22.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a9acb43a3e4a4e413e0c4abe0fa49308df7c6335c88534757b647199cb8a51" +checksum = "a505d0c6f851cbf2919535150198e530825def8bd3757477f13dc3a57f46cbcc" dependencies = [ "cuckoofilter", "fnv", - "futures 0.3.15", - "libp2p-core", + "futures", + "libp2p-core 0.33.0", "libp2p-swarm", - "prost", - "prost-build", + "log", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", - "smallvec 1.6.1", + "smallvec", ] [[package]] name = "libp2p-gossipsub" -version = "0.22.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab20fcb60edebe3173bbb708c6ac3444afdf1e3152dc2866b10c4f5497f17467" +checksum = "43e064ba4d7832e01c738626c6b274ae100baba05f5ffcc7b265c2a3ed398108" dependencies = [ - "base64 0.11.0", - "byteorder 1.4.3", - "bytes 0.5.6", + "asynchronous-codec", + "base64", + "byteorder", + "bytes", "fnv", - "futures 0.3.15", - "futures_codec", + "futures", "hex_fmt", - "libp2p-core", + "instant", + "libp2p-core 0.33.0", "libp2p-swarm", "log", - "lru_time_cache", - "prost", - "prost-build", + "prometheus-client", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.6.1", - "unsigned-varint 0.4.0", + "regex", + "sha2 0.10.6", + "smallvec", + "unsigned-varint", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.22.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56396ee63aa9164eacf40c2c5d2bda8c4133c2f57e1b0425d51d3a4e362583b1" +checksum = "b84b53490442d086db1fa5375670c9666e79143dccadef3f7c74a4346899a984" dependencies = [ - "futures 0.3.15", - "libp2p-core", + "asynchronous-codec", + "futures", + "futures-timer", + "libp2p-core 0.33.0", "libp2p-swarm", "log", - "prost", - "prost-build", - "smallvec 1.6.1", - "wasm-timer", + "lru", + "prost 0.10.4", + "prost-build 0.10.4", + "prost-codec", + "smallvec", + "thiserror", + "void", ] [[package]] name = "libp2p-kad" -version = "0.23.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7fa9047f8b8f544278a35c2d9d45d3b2c1785f2d86d4e1629d6edf97be3955" +checksum = "5f6b5d4de90fcd35feb65ea6223fd78f3b747a64ca4b65e0813fbe66a27d56aa" dependencies = [ - "arrayvec 0.5.2", - "bytes 0.5.6", + "arrayvec 0.7.2", + "asynchronous-codec", + "bytes", "either", "fnv", - "futures 0.3.15", - "futures_codec", - "libp2p-core", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", "libp2p-swarm", "log", - "multihash", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.10.4", "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.6.1", + "sha2 0.10.6", + "smallvec", + "thiserror", "uint", - "unsigned-varint 0.4.0", + "unsigned-varint", "void", - "wasm-timer", ] [[package]] name = "libp2p-mdns" -version = "0.22.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3173b5a6b2f690c29ae07798d85b9441a131ac76ddae9015ef22905b623d0c69" +checksum = "4783f8cf00c7b6c1ff0f1870b4fcf50b042b45533d2e13b6fb464caf447a6951" dependencies = [ - "async-std", + "async-io", "data-encoding", "dns-parser", - "either", - "futures 0.3.15", + "futures", + "if-watch", "lazy_static", - "libp2p-core", + "libp2p-core 0.33.0", "libp2p-swarm", "log", - "net2", - "rand 0.7.3", - "smallvec 1.6.1", + "rand 0.8.5", + "smallvec", + "socket2", "void", - "wasm-timer", +] + +[[package]] +name = "libp2p-metrics" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "564a7e5284d7d9b3140fdfc3cb6567bc32555e86a21de5604c2ec85da05cf384" +dependencies = [ + "libp2p-core 0.33.0", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-kad", + "libp2p-ping", + "libp2p-relay", + "libp2p-swarm", + "prometheus-client", ] [[package]] name = "libp2p-mplex" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a73a799cc8410b36e40b8f4c4b6babbcb9efd3727111bf517876e4acfa612d3" +checksum = "5ff9c893f2367631a711301d703c47432af898c9bb8253bea0e2c051a13f7640" dependencies = [ - "bytes 0.5.6", - "fnv", - "futures 0.3.15", - "futures_codec", - "libp2p-core", + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core 0.33.0", "log", - "parking_lot 0.10.2", - "unsigned-varint 0.4.0", + "nohash-hasher", + "parking_lot 0.12.1", + "rand 0.7.3", + "smallvec", + "unsigned-varint", ] [[package]] name = "libp2p-noise" -version = "0.24.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef6c490042f549fb1025f2892dfe6083d97a77558f450c1feebe748ca9eb15a" +checksum = "cf2cee1dad1c83325bbd182a8e94555778699cec8a9da00086efb7522c4c15ad" dependencies = [ - "bytes 0.5.6", - "curve25519-dalek 2.1.2", - "futures 0.3.15", + "bytes", + "curve25519-dalek 3.2.0", + "futures", "lazy_static", - "libp2p-core", + "libp2p-core 0.33.0", "log", - "prost", - "prost-build", - "rand 0.7.3", - "sha2 0.8.2", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "sha2 0.10.6", "snow", "static_assertions", - "x25519-dalek 0.6.0", + "x25519-dalek", "zeroize", ] [[package]] name = "libp2p-ping" -version = "0.22.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad063c21dfcea4518ac9e8bd4119d33a5b26c41e674f602f41f05617a368a5c8" +checksum = "d41516c82fe8dd148ec925eead0c5ec08a0628f7913597e93e126e4dfb4e0787" dependencies = [ - "futures 0.3.15", - "libp2p-core", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", "libp2p-swarm", "log", "rand 0.7.3", "void", - "wasm-timer", ] [[package]] name = "libp2p-plaintext" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903a12e99c72dbebefea258de887982adeacc7025baa1ceb10b7fa9928f54791" +checksum = "db007e737adc5d28b2e03223b0210164928ad742591127130796a72aa8eaf54f" dependencies = [ - "bytes 0.5.6", - "futures 0.3.15", - "futures_codec", - "libp2p-core", + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core 0.33.0", "log", - "prost", - "prost-build", - "rw-stream-sink", - "unsigned-varint 0.4.0", + "prost 0.10.4", + "prost-build 0.10.4", + "unsigned-varint", "void", ] [[package]] name = "libp2p-pnet" -version = "0.19.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b3c2d5d26a9500e959a0e19743897239a6c4be78dadf99b70414301a70c006" +checksum = "0f1a458bbda880107b5b36fcb9b5a1ef0c329685da0e203ed692a8ebe64cc92c" dependencies = [ - "futures 0.3.15", + "futures", "log", - "pin-project 0.4.28", + "pin-project 1.0.12", "rand 0.7.3", "salsa20", - "sha3", + "sha3 0.9.1", +] + +[[package]] +name = "libp2p-relay" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624ead3406f64437a0d4567c31bd128a9a0b8226d5f16c074038f5d0fc32f650" +dependencies = [ + "asynchronous-codec", + "bytes", + "either", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", + "libp2p-swarm", + "log", + "pin-project 1.0.12", + "prost 0.10.4", + "prost-build 0.10.4", + "prost-codec", + "rand 0.8.5", + "smallvec", + "static_assertions", + "thiserror", + "void", +] + +[[package]] +name = "libp2p-rendezvous" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59967ea2db2c7560f641aa58ac05982d42131863fcd3dd6dcf0dd1daf81c60c" +dependencies = [ + "asynchronous-codec", + "bimap", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", + "libp2p-swarm", + "log", + "prost 0.10.4", + "prost-build 0.10.4", + "rand 0.8.5", + "sha2 0.10.6", + "thiserror", + "unsigned-varint", + "void", ] [[package]] name = "libp2p-request-response" -version = "0.3.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0c9e8a4cd69d97e9646c54313d007512f411aba8c5226cfcda16df6a6e84a3" +checksum = "b02e0acb725e5a757d77c96b95298fd73a7394fe82ba7b8bbeea510719cbe441" dependencies = [ "async-trait", - "bytes 0.5.6", - "futures 0.3.15", - "libp2p-core", + "bytes", + "futures", + "instant", + "libp2p-core 0.33.0", "libp2p-swarm", "log", - "lru 0.6.5", - "minicbor", "rand 0.7.3", - "smallvec 1.6.1", - "unsigned-varint 0.5.1", - "wasm-timer", + "smallvec", + "unsigned-varint", ] [[package]] name = "libp2p-swarm" -version = "0.22.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193e444210132237b81b755ec7fe53f1c4bd2f53cf719729b94c0c72eb6eaa1" +checksum = "8f4bb21c5abadbf00360c734f16bf87f1712ed4f23cd46148f625d2ddb867346" dependencies = [ "either", - "futures 0.3.15", - "libp2p-core", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core 0.33.0", "log", + "pin-project 1.0.12", "rand 0.7.3", - "smallvec 1.6.1", + "smallvec", + "thiserror", "void", - "wasm-timer", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f693c8c68213034d472cbb93a379c63f4f307d97c06f1c41e4985de481687a5" +dependencies = [ + "quote", + "syn", ] [[package]] name = "libp2p-tcp" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f42ec130d7a37a7e47bf4398026b7ad9185c08ed26972e2720f8b94112796f" +checksum = "4f4933e38ef21b50698aefc87799c24f2a365c9d3f6cf50471f3f6a0bc410892" dependencies = [ - "async-std", - "futures 0.3.15", - "futures-timer 3.0.2", - "get_if_addrs", + "async-io", + "futures", + "futures-timer", + "if-watch", "ipnet", - "libp2p-core", + "libc", + "libp2p-core 0.33.0", "log", - "socket2 0.3.19", + "socket2", ] [[package]] name = "libp2p-uds" -version = "0.22.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7acb0a034f70d7db94c300eba3f65c0f6298820105624088a9609c9974d77" +checksum = "24bdab114f7f2701757d6541266e1131b429bbae382008f207f2114ee4222dcb" dependencies = [ "async-std", - "futures 0.3.15", - "libp2p-core", + "futures", + "libp2p-core 0.32.1", "log", ] [[package]] name = "libp2p-wasm-ext" -version = "0.22.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34c1faac6f92c21fbe155417957863ea822fba9e9fd5eb24c0912336a100e63f" +checksum = "f066f2b8b1a1d64793f05da2256e6842ecd0293d6735ca2e9bda89831a1bdc06" dependencies = [ - "futures 0.3.15", + "futures", "js-sys", - "libp2p-core", + "libp2p-core 0.33.0", "parity-send-wrapper", "wasm-bindgen", "wasm-bindgen-futures", @@ -3044,81 +3682,124 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.23.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d650534ebd99f48f6fa292ed5db10d30df2444943afde4407ceeddab8e513fca" +checksum = "39d398fbb29f432c4128fabdaac2ed155c3bcaf1b9bd40eeeb10a471eefacbf5" dependencies = [ - "async-tls", "either", - "futures 0.3.15", - "libp2p-core", + "futures", + "futures-rustls", + "libp2p-core 0.33.0", "log", + "parking_lot 0.12.1", "quicksink", - "rustls", - "rw-stream-sink", + "rw-stream-sink 0.3.0", "soketto", - "url 2.2.2", - "webpki", - "webpki-roots 0.18.0", + "url", + "webpki-roots", ] [[package]] name = "libp2p-yamux" -version = "0.25.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781d9b9f043dcdabc40640807125368596b849fd4d96cdca2dcf052fdf6f33fd" +checksum = "8fe653639ad74877c759720febb0cbcbf4caa221adde4eed2d3126ce5c6f381f" dependencies = [ - "futures 0.3.15", - "libp2p-core", - "parking_lot 0.11.1", + "futures", + "libp2p-core 0.33.0", + "parking_lot 0.12.1", "thiserror", "yamux", ] [[package]] name = "librocksdb-sys" -version = "6.20.3" +version = "0.6.1+6.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c309a9d2470844aceb9a4a098cf5286154d20596868b75a6b36357d2bb9ca25d" +checksum = "81bc587013734dadb7cf23468e531aa120788b87243648be42e2d3a072186291" dependencies = [ "bindgen", + "bzip2-sys", "cc", "glob", "libc", + "libz-sys", + "tikv-jemalloc-sys", ] [[package]] name = "libsecp256k1" -version = "0.3.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" +checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", - "crunchy", - "digest 0.8.1", + "base64", + "digest 0.9.0", "hmac-drbg", - "rand 0.7.3", - "sha2 0.8.2", - "subtle 2.4.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.8.5", + "serde", + "sha2 0.9.9", "typenum", ] +[[package]] +name = "libsecp256k1-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" +dependencies = [ + "libsecp256k1-core", +] + [[package]] name = "libz-sys" -version = "1.1.3" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" dependencies = [ "cc", "pkg-config", "vcpkg", ] +[[package]] +name = "link-cplusplus" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] + [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linked_hash_set" @@ -3131,15 +3812,20 @@ dependencies = [ [[package]] name = "linregress" -version = "0.1.7" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9290cf6f928576eeb9c096c6fad9d8d452a0a1a70a2bbffa6e36064eedc0aac9" +checksum = "d6c601a85f5ecd1aba625247bca0031585fb1c446461b142878a16f8245ddeb8" dependencies = [ - "failure", "nalgebra", "statrs", ] +[[package]] +name = "linux-raw-sys" +version = "0.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" + [[package]] name = "lite-json" version = "0.1.3" @@ -3155,69 +3841,81 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c50092e40e0ccd1bf2015a10333fde0502ff95b832b0895dc1ca0d7ac6c52f6" dependencies = [ - "paste", + "paste 0.1.18", ] [[package]] name = "lock_api" -version = "0.1.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ - "scopeguard 0.3.3", + "autocfg", + "scopeguard", ] [[package]] -name = "lock_api" -version = "0.3.4" +name = "log" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "scopeguard 1.1.0", + "cfg-if", + "value-bag", ] [[package]] -name = "lock_api" -version = "0.4.4" +name = "lru" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" dependencies = [ - "scopeguard 1.1.0", + "hashbrown", ] [[package]] -name = "log" -version = "0.4.14" +name = "lru-cache" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" dependencies = [ - "cfg-if 1.0.0", - "value-bag", + "linked-hash-map", ] [[package]] -name = "lru" -version = "0.4.3" +name = "lz4" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" dependencies = [ - "hashbrown 0.6.3", + "libc", + "lz4-sys", ] [[package]] -name = "lru" -version = "0.6.5" +name = "lz4-sys" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f374d42cdfc1d7dbf3d3dec28afab2eb97ffbf43a3234d795b5986dbf4b90ba" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" dependencies = [ - "hashbrown 0.9.1", + "cc", + "libc", ] [[package]] -name = "lru_time_cache" -version = "0.10.0" +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb241df5c4caeb888755363fc95f8a896618dc0d435e9e775f7930cb099beab" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchers" @@ -3230,67 +3928,60 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "matrixmultiply" -version = "0.2.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" dependencies = [ "rawpointer", ] -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - [[package]] name = "memchr" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] -name = "memmap" -version = "0.7.0" +name = "memfd" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +checksum = "f6627dc657574b49d6ad27105ed671822be56e0d2547d413bfbf3e8d8fa92e7a" dependencies = [ "libc", - "winapi 0.3.9", ] [[package]] -name = "memoffset" -version = "0.5.6" +name = "memmap2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" dependencies = [ - "autocfg 1.0.1", + "libc", ] [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.0.1", + "autocfg", ] [[package]] name = "memory-db" -version = "0.24.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f36ddb0b2cdc25d38babba472108798e3477f02be5165f038c5e393e50c57a" +checksum = "6566c70c1016f525ced45d7b7f97730a2bafb037c788211d0c186ef5b2189f0a" dependencies = [ "hash-db", - "hashbrown 0.8.2", + "hashbrown", "parity-util-mem", ] @@ -3306,32 +3997,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" dependencies = [ - "byteorder 1.4.3", + "byteorder", "keccak", "rand_core 0.5.1", "zeroize", ] -[[package]] -name = "minicbor" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc03ad6f8f548db7194a5ff5a6f96342ecae4e3ef67d2bf18bacc0e245cd041" -dependencies = [ - "minicbor-derive", -] - -[[package]] -name = "minicbor-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c214bf3d90099b52f3e4b328ae0fe34837fd0fab683ad1e10fceb4629106df48" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3340,102 +4011,89 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" dependencies = [ "adler", - "autocfg 1.0.1", ] [[package]] name = "mio" -version = "0.6.23" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio", - "slab", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] -name = "mio-named-pipes" -version = "0.1.7" +name = "more-asserts" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" -dependencies = [ - "log", - "mio", - "miow 0.3.7", - "winapi 0.3.9", -] +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] -name = "mio-uds" -version = "0.6.8" +name = "multiaddr" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" dependencies = [ - "iovec", - "libc", - "mio", + "arrayref", + "bs58", + "byteorder", + "data-encoding", + "multihash", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint", + "url", ] [[package]] -name = "miow" -version = "0.2.2" +name = "multibase" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", + "base-x", + "data-encoding", + "data-encoding-macro", ] [[package]] -name = "miow" -version = "0.3.7" +name = "multihash" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" dependencies = [ - "winapi 0.3.9", + "blake2b_simd", + "blake2s_simd", + "blake3", + "core2", + "digest 0.10.5", + "multihash-derive", + "sha2 0.10.6", + "sha3 0.10.5", + "unsigned-varint", ] [[package]] -name = "multihash" -version = "0.11.4" +name = "multihash-derive" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567122ab6492f49b59def14ecc36e13e64dca4188196dd0cd41f9f3f979f3df6" +checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ - "blake2b_simd", - "blake2s_simd", - "digest 0.9.0", - "sha-1 0.9.6", - "sha2 0.9.5", - "sha3", - "unsigned-varint 0.5.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] @@ -3446,83 +4104,161 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "multistream-select" -version = "0.8.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93faf2e41f9ee62fb01680ed48f3cc26652352327aa2e59869070358f6b7dd75" +checksum = "363a84be6453a70e63513660f4894ef815daf88e3356bffcda9ca27d810ce83b" dependencies = [ - "bytes 0.5.6", - "futures 0.3.15", + "bytes", + "futures", "log", - "pin-project 1.0.7", - "smallvec 1.6.1", - "unsigned-varint 0.5.1", + "pin-project 1.0.12", + "smallvec", + "unsigned-varint", ] [[package]] name = "nalgebra" -version = "0.18.1" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" +checksum = "462fffe4002f4f2e1f6a9dcf12cc1a6fc0e15989014efc02a941d3e0f5dc2120" dependencies = [ - "alga", "approx", - "generic-array 0.12.4", "matrixmultiply", + "nalgebra-macros", "num-complex", - "num-rational", + "num-rational 0.4.1", "num-traits", - "rand 0.6.5", + "rand 0.8.5", + "rand_distr", + "simba", "typenum", ] +[[package]] +name = "nalgebra-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "names" -version = "0.11.0" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25af9cf0dc55498b7bd94a1508af7a78706aa0ab715a73c5169273e03c84845e" +dependencies = [ + "anyhow", + "byteorder", + "paste 1.0.9", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" dependencies = [ - "rand 0.3.23", + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", ] [[package]] -name = "net2" -version = "0.2.37" +name = "netlink-sys" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "92b654097027250401127914afb37cb1f311df6610a9891ff07a757e94199027" dependencies = [ - "cfg-if 0.1.10", + "async-io", + "bytes", + "futures", "libc", - "winapi 0.3.9", + "log", ] [[package]] name = "nix" -version = "0.17.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if", "libc", - "void", ] [[package]] name = "node-inspect" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.9.0-dev" dependencies = [ - "derive_more", - "log", + "clap 3.2.22", + "overrides", "parity-scale-codec", "sc-cli", "sc-client-api", + "sc-executor", "sc-service", "sp-blockchain", "sp-core", "sp-runtime", - "structopt", + "thiserror", ] [[package]] @@ -3539,13 +4275,12 @@ checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", ] [[package]] @@ -3554,28 +4289,37 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.0.1", + "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.2.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" dependencies = [ - "autocfg 1.0.1", "num-traits", ] +[[package]] +name = "num-format" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b862ff8df690cf089058c98b183676a7ed0f974cc08b426800093227cbff3b" +dependencies = [ + "arrayvec 0.7.2", + "itoa 1.0.4", +] + [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg 1.0.1", + "autocfg", "num-traits", ] @@ -3585,27 +4329,38 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ - "autocfg 1.0.1", + "autocfg", "num-bigint", "num-integer", "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ - "autocfg 1.0.1", + "autocfg", "libm", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -3613,30 +4368,35 @@ dependencies = [ [[package]] name = "object" -version = "0.25.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38f2be3697a57b4060074ff41b44c16870d916ad7877c17696e063257482bc7" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" dependencies = [ + "crc32fast", + "indexmap", "memchr", ] [[package]] -name = "once_cell" -version = "0.1.8" +name = "object" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" dependencies = [ - "parking_lot 0.7.1", + "memchr", ] [[package]] name = "once_cell" -version = "1.8.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" -dependencies = [ - "parking_lot 0.11.1", -] +checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "opaque-debug" @@ -3652,9 +4412,19 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + +[[package]] +name = "overrides" +version = "0.1.0" [[package]] name = "owning_ref" @@ -3667,14 +4437,14 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "pallet-session", "parity-scale-codec", - "serde", + "scale-info", "sp-application-crypto", "sp-authority-discovery", "sp-runtime", @@ -3683,81 +4453,81 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", "parity-scale-codec", + "scale-info", "sp-authorship", - "sp-inherents", "sp-runtime", "sp-std", ] [[package]] name = "pallet-babe" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-authorship", "pallet-session", "pallet-timestamp", "parity-scale-codec", - "serde", + "scale-info", "sp-application-crypto", "sp-consensus-babe", "sp-consensus-vrf", - "sp-inherents", "sp-io", "sp-runtime", "sp-session", "sp-staking", "sp-std", - "sp-timestamp", ] [[package]] -name = "pallet-balances" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "pallet-bags-list" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", + "log", + "pallet-balances", "parity-scale-codec", - "serde", + "scale-info", + "sp-core", + "sp-io", "sp-runtime", "sp-std", + "sp-tracing", ] [[package]] -name = "pallet-blog" -version = "5.0.0" +name = "pallet-balances" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "pallet-balances", - "pallet-common", - "pallet-membership", - "pallet-staking-handler", - "pallet-timestamp", + "log", "parity-scale-codec", - "sp-arithmetic", - "sp-core", - "sp-io", + "scale-info", "sp-runtime", "sp-std", ] [[package]] name = "pallet-bounty" -version = "1.0.0" +version = "2.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3770,23 +4540,26 @@ dependencies = [ "pallet-staking-handler", "pallet-timestamp", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", "sp-io", "sp-runtime", "sp-std", + "static_assertions", ] [[package]] name = "pallet-common" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-support", "frame-system", "pallet-balances", "pallet-timestamp", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-runtime", @@ -3797,12 +4570,15 @@ dependencies = [ [[package]] name = "pallet-constitution" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "pallet-balances", + "pallet-common", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -3812,30 +4588,38 @@ dependencies = [ [[package]] name = "pallet-content" -version = "3.2.0" +version = "6.0.0" dependencies = [ + "derive-fixture", + "derive-new", + "frame-benchmarking", "frame-support", "frame-system", "pallet-balances", "pallet-common", "pallet-membership", + "pallet-project-token", "pallet-randomness-collective-flip", "pallet-staking-handler", "pallet-storage", "pallet-timestamp", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", "sp-io", "sp-runtime", "sp-std", + "strum 0.19.5", + "strum_macros 0.19.4", + "variant_count", ] [[package]] name = "pallet-council" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3848,6 +4632,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "rand 0.7.3", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -3857,24 +4642,44 @@ dependencies = [ ] [[package]] -name = "pallet-finality-tracker" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "pallet-election-provider-multi-phase" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", - "impl-trait-for-tuples", + "log", "parity-scale-codec", - "serde", - "sp-finality-tracker", - "sp-inherents", + "rand 0.7.3", + "scale-info", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-npos-elections", "sp-runtime", "sp-std", + "static_assertions", + "strum 0.23.0", +] + +[[package]] +name = "pallet-election-provider-support-benchmarking" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "frame-benchmarking", + "frame-election-provider-support", + "frame-system", + "parity-scale-codec", + "sp-npos-elections", + "sp-runtime", ] [[package]] name = "pallet-forum" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3886,6 +4691,7 @@ dependencies = [ "pallet-timestamp", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -3896,20 +4702,21 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-authorship", - "pallet-finality-tracker", "pallet-session", "parity-scale-codec", - "serde", + "scale-info", "sp-application-crypto", "sp-core", "sp-finality-grandpa", + "sp-io", "sp-runtime", "sp-session", "sp-staking", @@ -3918,16 +4725,16 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-authorship", - "pallet-session", "parity-scale-codec", - "serde", + "scale-info", "sp-application-crypto", "sp-core", "sp-io", @@ -3938,7 +4745,7 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3947,8 +4754,8 @@ dependencies = [ "pallet-common", "pallet-staking-handler", "pallet-timestamp", - "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -3957,15 +4764,32 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-multisig" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-offences" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", + "log", "pallet-balances", "parity-scale-codec", + "scale-info", "serde", "sp-runtime", "sp-staking", @@ -3974,10 +4798,11 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", "pallet-babe", @@ -3988,22 +4813,49 @@ dependencies = [ "pallet-session", "pallet-staking", "parity-scale-codec", + "scale-info", "sp-runtime", "sp-staking", "sp-std", ] +[[package]] +name = "pallet-project-token" +version = "1.0.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "pallet-balances", + "pallet-common", + "pallet-membership", + "pallet-randomness-collective-flip", + "pallet-staking-handler", + "pallet-storage", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-io", + "sp-runtime", + "sp-std", + "sp-storage", +] + [[package]] name = "pallet-proposals-codex" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", + "pallet-bags-list", "pallet-balances", - "pallet-blog", "pallet-common", "pallet-constitution", + "pallet-content", "pallet-council", "pallet-membership", "pallet-proposals-discussion", @@ -4015,10 +4867,12 @@ dependencies = [ "pallet-timestamp", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", "sp-io", + "sp-npos-elections", "sp-runtime", "sp-staking", "sp-std", @@ -4027,7 +4881,7 @@ dependencies = [ [[package]] name = "pallet-proposals-discussion" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4040,6 +4894,7 @@ dependencies = [ "pallet-staking-handler", "pallet-timestamp", "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -4049,7 +4904,7 @@ dependencies = [ [[package]] name = "pallet-proposals-engine" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4062,6 +4917,7 @@ dependencies = [ "pallet-staking-handler", "pallet-timestamp", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -4072,20 +4928,21 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", "safe-mix", + "scale-info", "sp-runtime", "sp-std", ] [[package]] name = "pallet-referendum" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4097,6 +4954,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "rand 0.7.3", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -4107,15 +4965,16 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "impl-trait-for-tuples", + "log", "pallet-timestamp", "parity-scale-codec", - "serde", + "scale-info", "sp-core", "sp-io", "sp-runtime", @@ -4127,8 +4986,8 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", @@ -4143,29 +5002,30 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", + "frame-election-provider-support", "frame-support", "frame-system", + "log", "pallet-authorship", "pallet-session", "parity-scale-codec", "rand_chacha 0.2.2", + "scale-info", "serde", "sp-application-crypto", "sp-io", - "sp-npos-elections", "sp-runtime", "sp-staking", "sp-std", - "static_assertions", ] [[package]] name = "pallet-staking-handler" -version = "2.0.0" +version = "3.0.0" dependencies = [ "frame-support", "frame-system", @@ -4173,6 +5033,8 @@ dependencies = [ "pallet-common", "pallet-timestamp", "parity-scale-codec", + "scale-info", + "serde", "sp-arithmetic", "sp-core", "sp-io", @@ -4182,8 +5044,8 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4193,8 +5055,10 @@ dependencies = [ [[package]] name = "pallet-storage" -version = "4.0.1" +version = "5.0.0" dependencies = [ + "derive-fixture", + "derive-new", "frame-benchmarking", "frame-support", "frame-system", @@ -4206,6 +5070,7 @@ dependencies = [ "pallet-timestamp", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -4216,13 +5081,13 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", "parity-scale-codec", - "serde", + "scale-info", "sp-io", "sp-runtime", "sp-std", @@ -4230,15 +5095,15 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", - "impl-trait-for-tuples", + "log", "parity-scale-codec", - "serde", + "scale-info", "sp-inherents", "sp-io", "sp-runtime", @@ -4248,15 +5113,14 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-support", "frame-system", - "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", + "scale-info", "serde", - "smallvec 1.6.1", "sp-core", "sp-io", "sp-runtime", @@ -4265,15 +5129,12 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", - "serde", "sp-api", "sp-blockchain", "sp-core", @@ -4283,20 +5144,35 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "frame-support", + "pallet-transaction-payment", "parity-scale-codec", - "serde", "sp-api", "sp-runtime", +] + +[[package]] +name = "pallet-transaction-storage" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "frame-support", + "frame-system", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-inherents", + "sp-io", + "sp-runtime", "sp-std", + "sp-transaction-storage-proof", ] [[package]] name = "pallet-utility" -version = "1.1.0" +version = "2.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4310,6 +5186,7 @@ dependencies = [ "pallet-timestamp", "pallet-working-group", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -4321,23 +5198,38 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-benchmarking", "frame-support", "frame-system", "parity-scale-codec", - "serde", + "scale-info", "sp-core", "sp-io", "sp-runtime", "sp-std", ] +[[package]] +name = "pallet-vesting" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-runtime", + "sp-std", +] + [[package]] name = "pallet-working-group" -version = "5.0.0" +version = "6.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -4348,6 +5240,7 @@ dependencies = [ "pallet-staking-handler", "pallet-timestamp", "parity-scale-codec", + "scale-info", "serde", "sp-arithmetic", "sp-core", @@ -4358,54 +5251,42 @@ dependencies = [ [[package]] name = "parity-db" -version = "0.1.2" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d595e372d119261593297debbe4193811a4dc811d2a1ccbb8caaa6666ad7ab" +checksum = "2c8fdb726a43661fa54b43e7114e6b88b2289cae388eb3ad766d9d1754d83fce" dependencies = [ "blake2-rfc", "crc32fast", + "fs2", + "hex", "libc", "log", - "memmap", - "parking_lot 0.10.2", -] - -[[package]] -name = "parity-multiaddr" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbecae7b7cfaafea47ceb5253ecdd14155ca8410e3487ed86031a6c2d5c15873" -dependencies = [ - "arrayref", - "bs58 0.4.0", - "byteorder 1.4.3", - "data-encoding", - "multihash", - "percent-encoding 2.1.0", - "serde", - "static_assertions", - "unsigned-varint 0.5.1", - "url 2.2.2", + "lz4", + "memmap2", + "parking_lot 0.12.1", + "rand 0.8.5", + "snap", ] [[package]] name = "parity-scale-codec" -version = "1.3.7" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b26b16c7687c3075982af47719e481815df30bc544f7a6690763a25ca16e9d" +checksum = "366e44391a8af4cfd6002ef6ba072bae071a96aafca98d7d448a34c5dca38b6a" dependencies = [ - "arrayvec 0.5.2", + "arrayvec 0.7.2", "bitvec", "byte-slice-cast", + "impl-trait-for-tuples", "parity-scale-codec-derive", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "1.2.3" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41512944b1faff334a5f1b9447611bf4ef40638ccb6328173dacefb338e878c" +checksum = "9299338969a3d2f491d65f140b00ddec470858402f888af98e8642fb5e8965cd" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4419,39 +5300,20 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" -[[package]] -name = "parity-tokio-ipc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e57fea504fea33f9fbb5f49f378359030e7e026a6ab849bb9e8f0787376f1bf" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "libc", - "log", - "mio-named-pipes", - "miow 0.3.7", - "rand 0.7.3", - "tokio 0.1.22", - "tokio-named-pipes", - "tokio-uds", - "winapi 0.3.9", -] - [[package]] name = "parity-util-mem" -version = "0.7.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297ff91fa36aec49ce183484b102f6b75b46776822bd81525bfc4cc9b0dd0f5c" +checksum = "c32561d248d352148124f036cac253a644685a21dc9fea383eb4907d7bd35a8f" dependencies = [ - "cfg-if 0.1.10", - "hashbrown 0.8.2", + "cfg-if", + "hashbrown", "impl-trait-for-tuples", "parity-util-mem-derive", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "primitive-types", - "smallvec 1.6.1", - "winapi 0.3.9", + "smallvec", + "winapi", ] [[package]] @@ -4467,27 +5329,18 @@ dependencies = [ [[package]] name = "parity-wasm" -version = "0.41.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" +checksum = "16ad52817c4d343339b3bc2e26861bd21478eda0b7509acf83505727000512ac" +dependencies = [ + "byteorder", +] [[package]] -name = "parity-ws" -version = "0.10.0" +name = "parity-wasm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e02a625dd75084c2a7024f07c575b61b782f729d18702dabb3cdbf31911dc61" -dependencies = [ - "byteorder 1.4.3", - "bytes 0.4.12", - "httparse", - "log", - "mio", - "mio-extras", - "rand 0.7.3", - "sha-1 0.8.2", - "slab", - "url 2.2.2", -] +checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92" [[package]] name = "parking" @@ -4497,100 +5350,50 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "parking_lot" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -dependencies = [ - "lock_api 0.1.5", - "parking_lot_core 0.4.0", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.6.2", - "rustc_version", -] - -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", -] - -[[package]] -name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.4", - "parking_lot_core 0.8.3", -] - -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -dependencies = [ - "libc", - "rand 0.6.5", - "rustc_version", - "smallvec 0.6.14", - "winapi 0.3.9", + "lock_api", + "parking_lot_core 0.8.5", ] [[package]] -name = "parking_lot_core" -version = "0.6.2" +name = "parking_lot" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "rustc_version", - "smallvec 0.6.14", - "winapi 0.3.9", + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] name = "parking_lot_core" -version = "0.7.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", + "cfg-if", + "instant", "libc", - "redox_syscall 0.1.57", - "smallvec 1.6.1", - "winapi 0.3.9", + "redox_syscall", + "smallvec", + "winapi", ] [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ - "cfg-if 1.0.0", - "instant", + "cfg-if", "libc", - "redox_syscall 0.2.8", - "smallvec 1.6.1", - "winapi 0.3.9", + "redox_syscall", + "smallvec", + "windows-sys", ] [[package]] @@ -4603,6 +5406,12 @@ dependencies = [ "proc-macro-hack", ] +[[package]] +name = "paste" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" + [[package]] name = "paste-impl" version = "0.1.18" @@ -4614,20 +5423,21 @@ dependencies = [ [[package]] name = "pbkdf2" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" dependencies = [ - "byteorder 1.4.3", - "crypto-mac 0.7.0", - "rayon", + "crypto-mac 0.8.0", ] [[package]] -name = "pdqselect" -version = "0.1.0" +name = "pbkdf2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec91767ecc0a0bbe558ce8c9da33c068066c57ecc8bb8477ef8c1ad3ef77c27" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +dependencies = [ + "crypto-mac 0.11.1", +] [[package]] name = "peeking_take_while" @@ -4637,21 +5447,59 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" -version = "1.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] -name = "percent-encoding" -version = "2.1.0" +name = "pest" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc7bc69c062e492337d74d59b120c274fd3d261b6bf6d3207d499b4b379c41a" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b75706b9642ebcb34dab3bc7750f811609a0eb1dd8b88c2d15bf628c1c65b2" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "f4f9272122f5979a6511a749af9db9bfc810393f63119970d7085fed1c4ea0db" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8717927f9b79515e565a64fe46c38b8cd0427e64c40680b14a7365ab09ac8d" +dependencies = [ + "once_cell", + "pest", + "sha1", +] [[package]] name = "petgraph" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" dependencies = [ "fixedbitset", "indexmap", @@ -4659,27 +5507,27 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.28" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" +checksum = "3ef0f924a5ee7ea9cbcea77529dba45f8a9ba9f622419fe3386ca581a3ae9d5a" dependencies = [ - "pin-project-internal 0.4.28", + "pin-project-internal 0.4.30", ] [[package]] name = "pin-project" -version = "1.0.7" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ - "pin-project-internal 1.0.7", + "pin-project-internal 1.0.12", ] [[package]] name = "pin-project-internal" -version = "0.4.28" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" +checksum = "851c8d0ce9bebe43790dedfc86614c23494ac9f423dd618d3a61fc693eafe61e" dependencies = [ "proc-macro2", "quote", @@ -4688,9 +5536,9 @@ dependencies = [ [[package]] name = "pin-project-internal" -version = "1.0.7" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", @@ -4705,9 +5553,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -4717,74 +5565,135 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "platforms" -version = "0.2.1" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d0eef3571242013a0d5dc84861c3ae4a652e56e12adf8bdc26ff5f8cb34c94" + +[[package]] +name = "plotters" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" + +[[package]] +name = "plotters-svg" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" +checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" +dependencies = [ + "plotters-backend", +] [[package]] name = "polling" -version = "2.1.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" +checksum = "899b00b9c8ab553c743b3e11e87c5c7d423b2a2de229ba95b24a756344748011" dependencies = [ - "cfg-if 1.0.0", + "autocfg", + "cfg-if", "libc", "log", "wepoll-ffi", - "winapi 0.3.9", + "winapi", ] [[package]] name = "poly1305" -version = "0.6.2" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug 0.3.0", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "predicates" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7456bc1ad2d4cf82b3a016be4c2ac48daf11bf990c1603ebd447fe6f30fca8" +checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" dependencies = [ - "cpuid-bool", - "universal-hash", + "difflib", + "itertools", + "predicates-core", ] [[package]] -name = "polyval" -version = "0.4.5" +name = "predicates-core" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug 0.3.0", - "universal-hash", -] +checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" [[package]] -name = "ppv-lite86" -version = "0.2.10" +name = "predicates-tree" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" +dependencies = [ + "predicates-core", + "termtree", +] [[package]] name = "primitive-types" -version = "0.7.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd39dcacf71411ba488570da7bbc89b717225e46478b30ba99b92db6b149809" +checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" dependencies = [ "fixed-hash", "impl-codec", "impl-serde", + "scale-info", "uint", ] [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ + "once_cell", + "thiserror", "toml", ] @@ -4818,173 +5727,214 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "prometheus" -version = "0.10.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d70cf4412832bcac9cffe27906f4a66e450d323525e977168c70d1b36120ae" +checksum = "45c8babc29389186697fe5a2a4859d697825496b83db5d0b65271cdc0488e88c" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", "fnv", "lazy_static", - "parking_lot 0.11.1", - "regex", + "memchr", + "parking_lot 0.12.1", "thiserror", ] +[[package]] +name = "prometheus-client" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1abe0255c04d15f571427a2d1e00099016506cf3297b53853acd2b7eb87825" +dependencies = [ + "dtoa", + "itoa 1.0.4", + "owning_ref", + "prometheus-client-derive-text-encode", +] + +[[package]] +name = "prometheus-client-derive-text-encode" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e12d01b9d66ad9eb4529c57666b6263fc1993cb30261d83ead658fdd932652" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "prost" -version = "0.6.1" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive 0.9.0", +] + +[[package]] +name = "prost" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" +checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ - "bytes 0.5.6", - "prost-derive", + "bytes", + "prost-derive 0.10.1", ] [[package]] name = "prost-build" -version = "0.6.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" +checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" dependencies = [ - "bytes 0.5.6", - "heck", + "bytes", + "heck 0.3.3", "itertools", + "lazy_static", "log", "multimap", "petgraph", - "prost", - "prost-types", + "prost 0.9.0", + "prost-types 0.9.0", + "regex", "tempfile", "which", ] [[package]] -name = "prost-derive" -version = "0.6.1" +name = "prost-build" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" +checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" dependencies = [ - "anyhow", + "bytes", + "cfg-if", + "cmake", + "heck 0.4.0", "itertools", - "proc-macro2", - "quote", - "syn", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost 0.10.4", + "prost-types 0.10.1", + "regex", + "tempfile", + "which", ] [[package]] -name = "prost-types" -version = "0.6.1" +name = "prost-codec" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" +checksum = "00af1e92c33b4813cc79fda3f2dbf56af5169709be0202df730e9ebc3e4cd007" dependencies = [ - "bytes 0.5.6", - "prost", + "asynchronous-codec", + "bytes", + "prost 0.10.4", + "thiserror", + "unsigned-varint", ] [[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quicksink" -version = "0.1.2" +name = "prost-derive" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" dependencies = [ - "futures-core", - "futures-sink", - "pin-project-lite 0.1.12", + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "quote" -version = "1.0.9" +name = "prost-derive" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" dependencies = [ + "anyhow", + "itertools", "proc-macro2", + "quote", + "syn", ] [[package]] -name = "radium" -version = "0.3.0" +name = "prost-types" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" +checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +dependencies = [ + "bytes", + "prost 0.9.0", +] [[package]] -name = "rand" -version = "0.3.23" +name = "prost-types" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ - "libc", - "rand 0.4.6", + "bytes", + "prost 0.10.4", ] [[package]] -name = "rand" -version = "0.4.6" +name = "psm" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi 0.3.9", + "cc", ] [[package]] -name = "rand" -version = "0.5.6" +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quicksink" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "winapi 0.3.9", + "futures-core", + "futures-sink", + "pin-project-lite 0.1.12", ] [[package]] -name = "rand" -version = "0.6.5" +name = "quote" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "autocfg 0.1.7", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg 0.1.2", - "rand_xorshift", - "winapi 0.3.9", + "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -4995,30 +5945,19 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", "rand_pcg 0.2.1", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.3.1", + "rand_core 0.6.4", ] [[package]] @@ -5038,24 +5977,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", + "rand_core 0.6.4", ] -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.5.1" @@ -5067,20 +5991,21 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", ] [[package]] -name = "rand_hc" -version = "0.1.0" +name = "rand_distr" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ - "rand_core 0.3.1", + "num-traits", + "rand 0.8.5", ] [[package]] @@ -5092,60 +6017,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "wasm-bindgen", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.4.2", -] - [[package]] name = "rand_pcg" version = "0.2.1" @@ -5156,12 +6027,12 @@ dependencies = [ ] [[package]] -name = "rand_xorshift" -version = "0.1.1" +name = "rand_pcg" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.6.4", ] [[package]] @@ -5172,88 +6043,84 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ - "autocfg 1.0.1", - "crossbeam-deque 0.8.0", + "autocfg", + "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", - "crossbeam-deque 0.8.0", - "crossbeam-utils 0.8.5", - "lazy_static", + "crossbeam-deque", + "crossbeam-utils", "num_cpus", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.3", - "redox_syscall 0.2.8", + "getrandom 0.2.7", + "redox_syscall", + "thiserror", ] [[package]] name = "ref-cast" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" +checksum = "b8ebf632f3e32bf35133f620cf481f29c99ae0fb01450fd3d85eee0225274ec1" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" +checksum = "caab98faa75ce294d40512ce514a46b15eafe78d72c9397a68ea45b3a88201b6" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "regalloc" +version = "0.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + [[package]] name = "regex" -version = "1.5.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -5271,9 +6138,38 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "region" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "remote-externalities" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "env_logger", + "jsonrpsee", + "log", + "parity-scale-codec", + "serde", + "serde_json", + "sp-core", + "sp-io", + "sp-runtime", + "sp-version", +] [[package]] name = "remove_dir_all" @@ -5281,14 +6177,35 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", ] [[package]] -name = "retain_mut" -version = "0.1.3" +name = "retain_mut" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" + +[[package]] +name = "rfc6979" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c17925a9027d298a4603d286befe3f9dc0e8ed02523141914eb628798d6e5b" +checksum = "96ef608575f6392792f9ecf7890c00086591d29a83910939d430753f7c050525" +dependencies = [ + "crypto-bigint", + "hmac 0.11.0", + "zeroize", +] [[package]] name = "ring" @@ -5298,18 +6215,18 @@ checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ "cc", "libc", - "once_cell 1.8.0", + "once_cell", "spin", "untrusted", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] name = "rocksdb" -version = "0.15.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d83c02c429044d58474eaf5ae31e062d0de894e21125b47437ec0edc1397e6" +checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290" dependencies = [ "libc", "librocksdb-sys", @@ -5317,19 +6234,34 @@ dependencies = [ [[package]] name = "rpassword" -version = "4.0.5" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" +checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "async-global-executor", + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix 0.24.2", + "thiserror", ] [[package]] name = "rustc-demangle" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc-hash" @@ -5349,16 +6281,38 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver", + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.14", +] + +[[package]] +name = "rustix" +version = "0.33.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "winapi", ] [[package]] name = "rustls" -version = "0.18.1" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ - "base64 0.12.3", "log", "ring", "sct", @@ -5367,32 +6321,58 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.4.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629d439a7672da82dd955498445e496ee2096fe2117b9f796558a43fdb9e59b8" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls", + "rustls-pemfile", "schannel", "security-framework", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + [[package]] name = "rw-stream-sink" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.15", - "pin-project 0.4.28", + "futures", + "pin-project 0.4.30", + "static_assertions", +] + +[[package]] +name = "rw-stream-sink" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +dependencies = [ + "futures", + "pin-project 1.0.12", "static_assertions", ] [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "safe-mix" @@ -5400,81 +6380,98 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" dependencies = [ - "rustc_version", + "rustc_version 0.2.3", ] [[package]] name = "salsa20" -version = "0.6.0" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0fbb5f676da676c260ba276a8f43a8dc67cf02d1438423aeb1c677a7212686" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f47b10fa80f6969bbbd9c8e7cc998f082979d402a9e10579e2303a87955395" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "sc-allocator" +version = "4.1.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "stream-cipher", + "log", + "sp-core", + "sp-wasm-interface", + "thiserror", ] [[package]] name = "sc-authority-discovery" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "bytes 0.5.6", - "derive_more", - "either", - "futures 0.3.15", - "futures-timer 3.0.2", + "async-trait", + "futures", + "futures-timer", + "ip_network", "libp2p", "log", "parity-scale-codec", - "prost", - "prost-build", + "prost 0.10.4", + "prost-build 0.9.0", "rand 0.7.3", "sc-client-api", - "sc-keystore", "sc-network", - "serde_json", "sp-api", "sp-authority-discovery", "sp-blockchain", "sp-core", + "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-basic-authorship" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", - "futures-timer 3.0.2", + "futures", + "futures-timer", "log", "parity-scale-codec", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", "sc-telemetry", + "sc-transaction-pool-api", "sp-api", "sp-blockchain", "sp-consensus", "sp-core", "sp-inherents", "sp-runtime", - "sp-transaction-pool", "substrate-prometheus-endpoint", - "tokio-executor 0.2.0-alpha.6", ] [[package]] name = "sc-block-builder" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", "sc-client-api", "sp-api", "sp-block-builder", "sp-blockchain", - "sp-consensus", "sp-core", "sp-inherents", "sp-runtime", @@ -5483,25 +6480,25 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "impl-trait-for-tuples", + "memmap2", "parity-scale-codec", "sc-chain-spec-derive", "sc-network", "sc-telemetry", "serde", "serde_json", - "sp-chain-spec", "sp-core", "sp-runtime", ] [[package]] name = "sc-chain-spec-derive" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5511,95 +6508,76 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "ansi_term 0.12.1", - "atty", - "bip39", "chrono", - "derive_more", + "clap 3.2.22", "fdlimit", - "futures 0.3.15", + "futures", "hex", - "lazy_static", "libp2p", "log", "names", - "nix", "parity-scale-codec", - "parity-util-mem", "rand 0.7.3", "regex", "rpassword", "sc-client-api", - "sc-informant", + "sc-client-db", "sc-keystore", "sc-network", "sc-service", "sc-telemetry", "sc-tracing", + "sc-utils", "serde", "serde_json", "sp-blockchain", "sp-core", "sp-keyring", + "sp-keystore", "sp-panic-handler", "sp-runtime", - "sp-state-machine", - "sp-utils", "sp-version", - "structopt", - "substrate-prometheus-endpoint", - "time", - "tokio 0.2.25", - "tracing", - "tracing-log", - "tracing-subscriber", + "thiserror", + "tiny-bip39", + "tokio", ] [[package]] name = "sc-client-api" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", "fnv", - "futures 0.3.15", + "futures", "hash-db", - "hex-literal", - "kvdb", - "lazy_static", "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "sc-executor", - "sc-telemetry", + "sc-transaction-pool-api", + "sc-utils", "sp-api", "sp-blockchain", "sp-consensus", "sp-core", "sp-database", "sp-externalities", - "sp-inherents", - "sp-keyring", + "sp-keystore", "sp-runtime", "sp-state-machine", - "sp-std", "sp-storage", - "sp-transaction-pool", "sp-trie", - "sp-utils", - "sp-version", "substrate-prometheus-endpoint", ] [[package]] name = "sc-client-db" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "blake2-rfc", "hash-db", "kvdb", "kvdb-memorydb", @@ -5608,56 +6586,63 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "sc-client-api", - "sc-executor", "sc-state-db", "sp-arithmetic", "sp-blockchain", - "sp-consensus", "sp-core", "sp-database", "sp-runtime", "sp-state-machine", "sp-trie", - "substrate-prometheus-endpoint", ] [[package]] name = "sc-consensus" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p", + "log", + "parking_lot 0.12.1", "sc-client-api", + "sc-utils", + "serde", + "sp-api", "sp-blockchain", "sp-consensus", + "sp-core", "sp-runtime", + "sp-state-machine", + "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-consensus-babe" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "async-trait", "fork-tree", - "futures 0.3.15", - "futures-timer 3.0.2", + "futures", "log", "merlin", "num-bigint", - "num-rational", + "num-rational 0.2.4", "num-traits", "parity-scale-codec", - "parking_lot 0.10.2", - "pdqselect", + "parking_lot 0.12.1", "rand 0.7.3", "retain_mut", "sc-client-api", + "sc-consensus", "sc-consensus-epochs", "sc-consensus-slots", - "sc-consensus-uncles", "sc-keystore", "sc-telemetry", "schnorrkel", @@ -5668,30 +6653,27 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-babe", + "sp-consensus-slots", "sp-consensus-vrf", "sp-core", "sp-inherents", "sp-io", + "sp-keystore", "sp-runtime", - "sp-timestamp", - "sp-utils", "sp-version", "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "futures", + "jsonrpsee", "sc-consensus-babe", "sc-consensus-epochs", - "sc-keystore", "sc-rpc-api", "serde", "sp-api", @@ -5700,36 +6682,38 @@ dependencies = [ "sp-consensus", "sp-consensus-babe", "sp-core", + "sp-keystore", "sp-runtime", + "thiserror", ] [[package]] name = "sc-consensus-epochs" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "fork-tree", "parity-scale-codec", - "parking_lot 0.10.2", "sc-client-api", + "sc-consensus", "sp-blockchain", "sp-runtime", ] [[package]] name = "sc-consensus-slots" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", - "futures-timer 3.0.2", + "async-trait", + "futures", + "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.10.2", "sc-client-api", + "sc-consensus", "sc-telemetry", - "sp-api", - "sp-application-crypto", + "sp-arithmetic", "sp-blockchain", "sp-consensus", "sp-consensus-slots", @@ -5737,103 +6721,124 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-state-machine", + "sp-timestamp", + "thiserror", ] [[package]] name = "sc-consensus-uncles" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "log", "sc-client-api", "sp-authorship", - "sp-consensus", - "sp-core", - "sp-inherents", "sp-runtime", + "thiserror", ] [[package]] name = "sc-executor" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", "lazy_static", - "libsecp256k1", - "log", + "lru", "parity-scale-codec", - "parity-wasm", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "sc-executor-common", "sc-executor-wasmi", + "sc-executor-wasmtime", "sp-api", "sp-core", + "sp-core-hashing-proc-macro", "sp-externalities", "sp-io", "sp-panic-handler", "sp-runtime-interface", - "sp-serializer", + "sp-tasks", "sp-trie", "sp-version", "sp-wasm-interface", + "tracing", "wasmi", ] [[package]] name = "sc-executor-common" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "log", + "environmental", "parity-scale-codec", - "parity-wasm", - "sp-allocator", - "sp-core", - "sp-runtime-interface", + "sc-allocator", + "sp-maybe-compressed-blob", + "sp-sandbox", "sp-serializer", "sp-wasm-interface", + "thiserror", + "wasm-instrument", "wasmi", ] [[package]] name = "sc-executor-wasmi" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "log", "parity-scale-codec", + "sc-allocator", "sc-executor-common", - "sp-allocator", - "sp-core", "sp-runtime-interface", + "sp-sandbox", "sp-wasm-interface", "wasmi", ] +[[package]] +name = "sc-executor-wasmtime" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "cfg-if", + "libc", + "log", + "parity-scale-codec", + "parity-wasm 0.42.2", + "sc-allocator", + "sc-executor-common", + "sp-runtime-interface", + "sp-sandbox", + "sp-wasm-interface", + "wasmtime", +] + [[package]] name = "sc-finality-grandpa" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "ahash", + "async-trait", + "dyn-clone", "finality-grandpa", "fork-tree", - "futures 0.3.15", - "futures-timer 3.0.2", + "futures", + "futures-timer", + "hex", "log", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project 0.4.28", - "rand 0.7.3", + "parking_lot 0.12.1", + "rand 0.8.5", "sc-block-builder", + "sc-chain-spec", "sc-client-api", "sc-consensus", "sc-keystore", "sc-network", "sc-network-gossip", "sc-telemetry", + "sc-utils", "serde_json", "sp-api", "sp-application-crypto", @@ -5842,25 +6847,20 @@ dependencies = [ "sp-consensus", "sp-core", "sp-finality-grandpa", - "sp-finality-tracker", - "sp-inherents", + "sp-keystore", "sp-runtime", - "sp-utils", "substrate-prometheus-endpoint", + "thiserror", ] [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", "finality-grandpa", - "futures 0.3.15", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "futures", + "jsonrpsee", "log", "parity-scale-codec", "sc-client-api", @@ -5871,174 +6871,217 @@ dependencies = [ "sp-blockchain", "sp-core", "sp-runtime", + "thiserror", ] [[package]] name = "sc-informant" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "ansi_term 0.12.1", - "futures 0.3.15", + "ansi_term", + "futures", + "futures-timer", "log", "parity-util-mem", "sc-client-api", "sc-network", + "sc-transaction-pool-api", "sp-blockchain", "sp-runtime", - "sp-transaction-pool", - "sp-utils", - "wasm-timer", ] [[package]] name = "sc-keystore" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "async-trait", "hex", - "merlin", - "parking_lot 0.10.2", - "rand 0.7.3", + "parking_lot 0.12.1", "serde_json", "sp-application-crypto", "sp-core", - "subtle 2.4.0", + "sp-keystore", + "thiserror", ] [[package]] -name = "sc-light" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "sc-network" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "hash-db", - "lazy_static", + "async-trait", + "asynchronous-codec", + "bitflags", + "bytes", + "cid", + "either", + "fnv", + "fork-tree", + "futures", + "futures-timer", + "hex", + "ip_network", + "libp2p", + "linked-hash-map", + "linked_hash_set", + "log", + "lru", + "parity-scale-codec", + "parking_lot 0.12.1", + "pin-project 1.0.12", + "prost 0.10.4", + "prost-build 0.9.0", + "rand 0.7.3", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sc-network-common", + "sc-network-light", + "sc-network-sync", + "sc-peerset", + "sc-utils", + "serde", + "serde_json", + "smallvec", + "sp-arithmetic", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-finality-grandpa", + "sp-runtime", + "substrate-prometheus-endpoint", + "thiserror", + "unsigned-varint", + "void", + "zeroize", +] + +[[package]] +name = "sc-network-common" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "futures", + "libp2p", + "parity-scale-codec", + "prost-build 0.9.0", + "sc-peerset", + "smallvec", +] + +[[package]] +name = "sc-network-gossip" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "ahash", + "futures", + "futures-timer", + "libp2p", + "log", + "lru", + "sc-network", + "sp-runtime", + "substrate-prometheus-endpoint", + "tracing", +] + +[[package]] +name = "sc-network-light" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "futures", + "libp2p", + "log", "parity-scale-codec", - "parking_lot 0.10.2", + "prost 0.10.4", + "prost-build 0.9.0", "sc-client-api", - "sc-executor", - "sp-api", + "sc-network-common", + "sc-peerset", "sp-blockchain", "sp-core", - "sp-externalities", "sp-runtime", - "sp-state-machine", + "thiserror", ] [[package]] -name = "sc-network" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "sc-network-sync" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "async-std", - "async-trait", "bitflags", - "bs58 0.3.1", - "bytes 0.5.6", - "derive_more", "either", - "erased-serde", - "fnv", "fork-tree", - "futures 0.3.15", - "futures-timer 3.0.2", - "futures_codec", - "hex", - "ip_network", + "futures", "libp2p", - "linked-hash-map", - "linked_hash_set", "log", - "lru 0.4.3", - "nohash-hasher", + "lru", "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project 0.4.28", - "prost", - "prost-build", - "rand 0.7.3", - "sc-block-builder", + "prost 0.10.4", + "prost-build 0.9.0", "sc-client-api", + "sc-consensus", + "sc-network-common", "sc-peerset", - "serde", - "serde_json", - "slog", - "slog_derive", - "smallvec 0.6.14", + "smallvec", "sp-arithmetic", "sp-blockchain", "sp-consensus", "sp-core", + "sp-finality-grandpa", "sp-runtime", - "sp-utils", - "substrate-prometheus-endpoint", "thiserror", - "unsigned-varint 0.4.0", - "void", - "wasm-timer", - "zeroize", -] - -[[package]] -name = "sc-network-gossip" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "futures 0.3.15", - "futures-timer 3.0.2", - "libp2p", - "log", - "lru 0.4.3", - "sc-network", - "sp-runtime", - "wasm-timer", ] [[package]] name = "sc-offchain" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "bytes 0.5.6", + "bytes", "fnv", - "futures 0.3.15", - "futures-timer 3.0.2", - "hyper 0.13.10", + "futures", + "futures-timer", + "hex", + "hyper", "hyper-rustls", - "log", "num_cpus", + "once_cell", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "rand 0.7.3", "sc-client-api", - "sc-keystore", "sc-network", + "sc-utils", "sp-api", "sp-core", "sp-offchain", "sp-runtime", - "sp-utils", "threadpool", + "tracing", ] [[package]] name = "sc-peerset" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", + "futures", "libp2p", "log", + "sc-utils", "serde_json", - "sp-utils", "wasm-timer", ] [[package]] name = "sc-proposer-metrics" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -6046,117 +7089,109 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", + "futures", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", + "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "sc-block-builder", + "sc-chain-spec", "sc-client-api", - "sc-executor", - "sc-keystore", "sc-rpc-api", + "sc-tracing", + "sc-transaction-pool-api", + "sc-utils", "serde_json", "sp-api", "sp-blockchain", - "sp-chain-spec", "sp-core", + "sp-keystore", "sp-offchain", "sp-rpc", "sp-runtime", "sp-session", - "sp-state-machine", - "sp-transaction-pool", - "sp-utils", "sp-version", ] [[package]] name = "sc-rpc-api" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", + "futures", + "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", + "sc-chain-spec", + "sc-transaction-pool-api", + "scale-info", "serde", "serde_json", - "sp-chain-spec", "sp-core", "sp-rpc", "sp-runtime", - "sp-transaction-pool", + "sp-tracing", "sp-version", + "thiserror", ] [[package]] name = "sc-rpc-server" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.1.31", - "jsonrpc-core", - "jsonrpc-http-server", - "jsonrpc-ipc-server", - "jsonrpc-pubsub", - "jsonrpc-ws-server", + "futures", + "jsonrpsee", "log", - "serde", "serde_json", - "sp-runtime", "substrate-prometheus-endpoint", + "tokio", ] [[package]] name = "sc-service" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "async-trait", "directories", "exit-future", - "futures 0.1.31", - "futures 0.3.15", - "futures-timer 3.0.2", + "futures", + "futures-timer", "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", - "lazy_static", + "jsonrpsee", "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", - "pin-project 0.4.28", + "parking_lot 0.12.1", + "pin-project 1.0.12", "rand 0.7.3", "sc-block-builder", "sc-chain-spec", "sc-client-api", "sc-client-db", + "sc-consensus", "sc-executor", "sc-informant", "sc-keystore", - "sc-light", "sc-network", + "sc-network-common", "sc-offchain", "sc-rpc", "sc-rpc-server", + "sc-sysinfo", "sc-telemetry", "sc-tracing", "sc-transaction-pool", + "sc-transaction-pool-api", + "sc-utils", "serde", "serde_json", - "slog", "sp-api", "sp-application-crypto", "sp-block-builder", @@ -6165,40 +7200,44 @@ dependencies = [ "sp-core", "sp-externalities", "sp-inherents", - "sp-io", + "sp-keystore", "sp-runtime", "sp-session", "sp-state-machine", + "sp-storage", "sp-tracing", "sp-transaction-pool", + "sp-transaction-storage-proof", "sp-trie", - "sp-utils", "sp-version", "substrate-prometheus-endpoint", "tempfile", + "thiserror", + "tokio", "tracing", - "wasm-timer", + "tracing-futures", ] [[package]] name = "sc-service-test" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "fdlimit", - "futures 0.1.31", - "futures 0.3.15", + "futures", + "hex", "hex-literal", "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "sc-block-builder", "sc-client-api", "sc-client-db", + "sc-consensus", "sc-executor", - "sc-light", "sc-network", "sc-service", + "sc-transaction-pool-api", "sp-api", "sp-blockchain", "sp-consensus", @@ -6209,123 +7248,212 @@ dependencies = [ "sp-state-machine", "sp-storage", "sp-tracing", - "sp-transaction-pool", "sp-trie", "substrate-test-runtime", "substrate-test-runtime-client", "tempfile", - "tokio 0.1.22", + "tokio", ] [[package]] name = "sc-state-db" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "log", "parity-scale-codec", "parity-util-mem", "parity-util-mem-derive", - "parking_lot 0.10.2", + "parking_lot 0.12.1", + "sc-client-api", + "sp-core", +] + +[[package]] +name = "sc-sync-state-rpc" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "jsonrpsee", + "parity-scale-codec", + "sc-chain-spec", "sc-client-api", + "sc-consensus-babe", + "sc-consensus-epochs", + "sc-finality-grandpa", + "serde", + "serde_json", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-sysinfo" +version = "6.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "futures", + "libc", + "log", + "rand 0.7.3", + "rand_pcg 0.2.1", + "regex", + "sc-telemetry", + "serde", + "serde_json", "sp-core", + "sp-io", + "sp-std", ] [[package]] name = "sc-telemetry" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", - "futures-timer 3.0.2", + "chrono", + "futures", "libp2p", "log", - "parking_lot 0.10.2", - "pin-project 0.4.28", + "parking_lot 0.12.1", + "pin-project 1.0.12", "rand 0.7.3", "serde", - "slog", - "slog-json", - "slog-scope", - "take_mut", - "void", + "serde_json", + "thiserror", "wasm-timer", ] [[package]] name = "sc-tracing" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "erased-serde", + "ansi_term", + "atty", + "chrono", + "lazy_static", + "libc", "log", - "parking_lot 0.10.2", + "once_cell", + "parking_lot 0.12.1", + "regex", "rustc-hash", - "sc-telemetry", + "sc-client-api", + "sc-rpc-server", + "sc-tracing-proc-macro", "serde", - "serde_json", - "slog", + "sp-api", + "sp-blockchain", + "sp-core", + "sp-rpc", + "sp-runtime", "sp-tracing", + "thiserror", "tracing", - "tracing-core", + "tracing-log", "tracing-subscriber", ] [[package]] -name = "sc-transaction-graph" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "sc-tracing-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", - "linked-hash-map", - "log", - "parity-util-mem", - "parking_lot 0.10.2", - "retain_mut", - "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-transaction-pool", - "sp-utils", - "wasm-timer", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "sc-transaction-pool" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", - "futures-diagnose", - "intervalier", + "futures", + "futures-timer", + "linked-hash-map", "log", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.12.1", + "retain_mut", "sc-client-api", - "sc-transaction-graph", + "sc-transaction-pool-api", + "sc-utils", + "serde", "sp-api", "sp-blockchain", "sp-core", "sp-runtime", "sp-tracing", "sp-transaction-pool", - "sp-utils", "substrate-prometheus-endpoint", - "wasm-timer", + "thiserror", +] + +[[package]] +name = "sc-transaction-pool-api" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "futures", + "log", + "serde", + "sp-blockchain", + "sp-runtime", + "thiserror", +] + +[[package]] +name = "sc-utils" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "futures", + "futures-timer", + "lazy_static", + "log", + "parking_lot 0.12.1", + "prometheus", +] + +[[package]] +name = "scale-info" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "333af15b02563b8182cd863f925bd31ef8fa86a0e095d30c091956057d436153" +dependencies = [ + "bitvec", + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", + "serde", +] + +[[package]] +name = "scale-info-derive" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53f56acbd0743d29ffa08f911ab5397def774ad01bab3786804cf6ee057fb5e1" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -6336,52 +7464,82 @@ checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" dependencies = [ "arrayref", "arrayvec 0.5.2", - "curve25519-dalek 2.1.2", + "curve25519-dalek 2.1.3", "getrandom 0.1.16", "merlin", "rand 0.7.3", "rand_core 0.5.1", "sha2 0.8.2", - "subtle 2.4.0", + "subtle", "zeroize", ] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "scopeguard" -version = "1.1.0" +name = "scratch" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" [[package]] name = "sct" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ "ring", "untrusted", ] +[[package]] +name = "sec1" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" +dependencies = [ + "der", + "generic-array 0.14.6", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" +dependencies = [ + "cc", +] + [[package]] name = "secrecy" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9182278ed645df3477a9c27bfee0621c621aa16f6972635f7f795dae3d81070f" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ "zeroize", ] [[package]] name = "security-framework" -version = "1.0.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad502866817f0575705bd7be36e2b2535cc33262d493aa733a2ec862baa2bc2b" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ "bitflags", "core-foundation", @@ -6392,9 +7550,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "1.0.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ceb04988b17b6d1dcd555390fa822ca5637b4a14e1f5099f13d351bed4d6c7" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -6402,45 +7560,61 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ "semver-parser", ] [[package]] -name = "semver-parser" -version = "0.7.0" +name = "semver" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] [[package]] -name = "send_wrapper" -version = "0.3.0" +name = "semver" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686ef91cf020ad8d4aca9a7047641fd6add626b7b89e14546c2b6a76781cf822" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +dependencies = [ + "serde", +] [[package]] -name = "send_wrapper" -version = "0.4.0" +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.126" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" dependencies = [ "serde_derive", ] +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + [[package]] name = "serde_derive" -version = "1.0.126" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" dependencies = [ "proc-macro2", "quote", @@ -6460,40 +7634,66 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.64" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" +checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" dependencies = [ - "itoa", + "itoa 1.0.4", "ryu", "serde", ] [[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +name = "serde_nanos" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e44969a61f5d316be20a42ff97816efb3b407a924d06824c3d8a49fa8450de0e" +dependencies = [ + "serde", +] + +[[package]] +name = "session-keys" +version = "1.0.0" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "async-std", + "clap 3.2.22", + "enum-utils", + "futures-util", + "joystream-node", + "rand 0.8.5", + "sc-chain-spec", + "sc-keystore", + "sc-telemetry", + "serde_json", + "sp-core", + "sp-keystore", ] [[package]] name = "sha-1" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.5", +] + [[package]] name = "sha2" version = "0.8.2" @@ -6508,17 +7708,28 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.5", +] + [[package]] name = "sha3" version = "0.9.1" @@ -6531,11 +7742,21 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "sha3" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2904bea16a1ae962b483322a1c7b81d976029203aea1f461e51cd7705db7ba9" +dependencies = [ + "digest 0.10.5", + "keccak", +] + [[package]] name = "sharded-slab" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c719719ee05df97490f80a45acfc99e5a30ce98a1e4fb67aee422745ae14e3" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" dependencies = [ "lazy_static", ] @@ -6548,9 +7769,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" -version = "0.3.9" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "470c5a6397076fae0094aaf06a08e6ba6f37acb77d3b1b91ea92b4d6c8650c39" +checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" dependencies = [ "libc", "signal-hook-registry", @@ -6567,148 +7788,97 @@ dependencies = [ [[package]] name = "signature" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0242b8e50dd9accdd56170e94ca1ebd223b098eb9c83539a6e367d0f36ae68" - -[[package]] -name = "slab" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" - -[[package]] -name = "slog" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" -dependencies = [ - "erased-serde", -] - -[[package]] -name = "slog-json" -version = "2.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" +checksum = "02658e48d89f2bec991f9a78e69cfa4c316f8d6a6c4ec12fae1aeb263d486788" dependencies = [ - "chrono", - "erased-serde", - "serde", - "serde_json", - "slog", + "digest 0.9.0", + "rand_core 0.6.4", ] [[package]] -name = "slog-scope" -version = "4.4.0" +name = "simba" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f95a4b4c3274cd2869549da82b57ccc930859bdbf5bcea0424bc5f140b3c786" +checksum = "8e82063457853d00243beda9952e910b82593e4b07ae9f721b9278a99a0d3d5c" dependencies = [ - "arc-swap", - "lazy_static", - "slog", + "approx", + "num-complex", + "num-traits", + "paste 1.0.9", ] [[package]] -name = "slog_derive" -version = "0.2.0" +name = "slab" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" dependencies = [ - "proc-macro2", - "quote", - "syn", + "autocfg", ] [[package]] name = "smallvec" -version = "0.6.14" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" -dependencies = [ - "maybe-uninit", -] +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] -name = "smallvec" -version = "1.6.1" +name = "snap" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "45456094d1983e2ee2a18fdfebce3189fa451699d0502cb8e3b49dba5ba41451" [[package]] name = "snow" -version = "0.7.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795dd7aeeee24468e5a32661f6d27f7b5cbed802031b2d7640c7b10f8fb2dd50" +checksum = "774d05a3edae07ce6d68ea6984f3c05e9bba8927e3dd591e3b479e5b03213d0d" dependencies = [ "aes-gcm", "blake2", "chacha20poly1305", - "rand 0.7.3", - "rand_core 0.5.1", + "curve25519-dalek 4.0.0-pre.1", + "rand_core 0.6.4", "ring", - "rustc_version", - "sha2 0.9.5", - "subtle 2.4.0", - "x25519-dalek 1.1.1", + "rustc_version 0.4.0", + "sha2 0.10.6", + "subtle", ] [[package]] name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "socket2" -version = "0.4.0" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "soketto" -version = "0.4.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c71ed3d54db0a699f4948e1bb3e45b450fa31fe602621dee6680361d569c88" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ - "base64 0.12.3", - "bytes 0.5.6", + "base64", + "bytes", "flate2", - "futures 0.3.15", + "futures", "httparse", "log", - "rand 0.7.3", - "sha-1 0.9.6", -] - -[[package]] -name = "sp-allocator" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "derive_more", - "log", - "sp-core", - "sp-std", - "sp-wasm-interface", + "rand 0.8.5", + "sha-1", ] [[package]] name = "sp-api" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "hash-db", + "log", "parity-scale-codec", "sp-api-proc-macro", "sp-core", @@ -6716,14 +7886,15 @@ dependencies = [ "sp-state-machine", "sp-std", "sp-version", + "thiserror", ] [[package]] name = "sp-api-proc-macro" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "blake2-rfc", + "blake2", "proc-macro-crate", "proc-macro2", "quote", @@ -6732,10 +7903,11 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", "serde", "sp-core", "sp-io", @@ -6744,23 +7916,26 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "5.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", + "scale-info", "serde", "sp-debug-derive", "sp-std", + "static_assertions", ] [[package]] name = "sp-authority-discovery" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", "sp-api", "sp-application-crypto", "sp-runtime", @@ -6769,9 +7944,10 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "async-trait", "parity-scale-codec", "sp-inherents", "sp-runtime", @@ -6780,8 +7956,8 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", "sp-api", @@ -6792,64 +7968,53 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "futures", "log", - "lru 0.4.3", + "lru", "parity-scale-codec", - "parking_lot 0.10.2", - "sp-block-builder", + "parking_lot 0.12.1", + "sp-api", "sp-consensus", "sp-database", "sp-runtime", "sp-state-machine", -] - -[[package]] -name = "sp-chain-spec" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "serde", - "serde_json", + "thiserror", ] [[package]] name = "sp-consensus" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", - "futures-timer 3.0.2", - "libp2p", + "async-trait", + "futures", + "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.10.2", - "serde", - "sp-api", "sp-core", "sp-inherents", "sp-runtime", "sp-state-machine", "sp-std", - "sp-trie", - "sp-utils", "sp-version", - "substrate-prometheus-endpoint", - "wasm-timer", + "thiserror", ] [[package]] name = "sp-consensus-aura" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "async-trait", "parity-scale-codec", + "scale-info", "sp-api", "sp-application-crypto", + "sp-consensus", + "sp-consensus-slots", "sp-inherents", "sp-runtime", "sp-std", @@ -6858,11 +8023,14 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "async-trait", "merlin", "parity-scale-codec", + "scale-info", + "serde", "sp-api", "sp-application-crypto", "sp-consensus", @@ -6870,6 +8038,7 @@ dependencies = [ "sp-consensus-vrf", "sp-core", "sp-inherents", + "sp-keystore", "sp-runtime", "sp-std", "sp-timestamp", @@ -6877,19 +8046,25 @@ dependencies = [ [[package]] name = "sp-consensus-slots" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", "sp-runtime", + "sp-std", + "sp-timestamp", ] [[package]] name = "sp-consensus-vrf" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", "schnorrkel", "sp-core", "sp-runtime", @@ -6898,16 +8073,16 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "base58", + "bitflags", "blake2-rfc", - "byteorder 1.4.3", - "derive_more", + "byteorder", "dyn-clonable", "ed25519-dalek", - "futures 0.3.15", + "futures", "hash-db", "hash256-std-hasher", "hex", @@ -6919,40 +8094,67 @@ dependencies = [ "num-traits", "parity-scale-codec", "parity-util-mem", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "primitive-types", "rand 0.7.3", "regex", + "scale-info", "schnorrkel", + "secp256k1", "secrecy", "serde", - "sha2 0.8.2", + "sp-core-hashing", "sp-debug-derive", "sp-externalities", "sp-runtime-interface", "sp-std", "sp-storage", + "ss58-registry", "substrate-bip39", + "thiserror", "tiny-bip39", - "tiny-keccak", - "twox-hash", "wasmi", "zeroize", ] +[[package]] +name = "sp-core-hashing" +version = "4.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "blake2", + "byteorder", + "digest 0.10.5", + "sha2 0.10.6", + "sha3 0.10.5", + "sp-std", + "twox-hash", +] + +[[package]] +name = "sp-core-hashing-proc-macro" +version = "5.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "proc-macro2", + "quote", + "sp-core-hashing", + "syn", +] + [[package]] name = "sp-database" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "kvdb", - "parking_lot 0.10.2", + "parking_lot 0.12.1", ] [[package]] name = "sp-debug-derive" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "proc-macro2", "quote", @@ -6961,8 +8163,8 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.12.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "environmental", "parity-scale-codec", @@ -6972,55 +8174,51 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "finality-grandpa", "log", "parity-scale-codec", + "scale-info", "serde", "sp-api", "sp-application-crypto", "sp-core", + "sp-keystore", "sp-runtime", "sp-std", ] -[[package]] -name = "sp-finality-tracker" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "parity-scale-codec", - "sp-inherents", - "sp-std", -] - [[package]] name = "sp-inherents" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", + "async-trait", + "impl-trait-for-tuples", "parity-scale-codec", - "parking_lot 0.10.2", "sp-core", + "sp-runtime", "sp-std", + "thiserror", ] [[package]] name = "sp-io" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.3.15", + "futures", "hash-db", "libsecp256k1", "log", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", + "secp256k1", "sp-core", "sp-externalities", + "sp-keystore", "sp-runtime-interface", "sp-state-machine", "sp-std", @@ -7033,42 +8231,59 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "lazy_static", "sp-core", "sp-runtime", - "strum 0.16.0", + "strum 0.23.0", ] [[package]] -name = "sp-npos-elections" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "sp-keystore" +version = "0.12.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "async-trait", + "futures", + "merlin", "parity-scale-codec", + "parking_lot 0.12.1", + "schnorrkel", "serde", - "sp-arithmetic", - "sp-npos-elections-compact", - "sp-std", + "sp-core", + "sp-externalities", + "thiserror", ] [[package]] -name = "sp-npos-elections-compact" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "sp-maybe-compressed-blob" +version = "4.1.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", + "thiserror", + "zstd", +] + +[[package]] +name = "sp-npos-elections" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic", + "sp-core", + "sp-runtime", + "sp-std", ] [[package]] name = "sp-offchain" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "sp-api", "sp-core", @@ -7077,26 +8292,28 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "backtrace", - "log", + "lazy_static", + "regex", ] [[package]] name = "sp-rpc" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "rustc-hash", "serde", "sp-core", ] [[package]] name = "sp-runtime" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "either", "hash256-std-hasher", @@ -7104,22 +8321,23 @@ dependencies = [ "log", "parity-scale-codec", "parity-util-mem", - "paste", + "paste 1.0.9", "rand 0.7.3", + "scale-info", "serde", "sp-application-crypto", "sp-arithmetic", "sp-core", - "sp-inherents", "sp-io", "sp-std", ] [[package]] name = "sp-runtime-interface" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ + "impl-trait-for-tuples", "parity-scale-codec", "primitive-types", "sp-externalities", @@ -7133,8 +8351,8 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "5.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "Inflector", "proc-macro-crate", @@ -7143,10 +8361,24 @@ dependencies = [ "syn", ] +[[package]] +name = "sp-sandbox" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "log", + "parity-scale-codec", + "sp-core", + "sp-io", + "sp-std", + "sp-wasm-interface", + "wasmi", +] + [[package]] name = "sp-serializer" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "serde", "serde_json", @@ -7154,10 +8386,11 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", "sp-api", "sp-core", "sp-runtime", @@ -7167,44 +8400,46 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "parity-scale-codec", + "scale-info", "sp-runtime", "sp-std", ] [[package]] name = "sp-state-machine" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.12.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "hash-db", "log", "num-traits", "parity-scale-codec", - "parking_lot 0.10.2", + "parking_lot 0.12.1", "rand 0.7.3", - "smallvec 1.6.1", + "smallvec", "sp-core", "sp-externalities", "sp-panic-handler", "sp-std", "sp-trie", - "trie-db", + "thiserror", + "tracing", "trie-root", ] [[package]] name = "sp-std" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" [[package]] name = "sp-storage" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "impl-serde", "parity-scale-codec", @@ -7214,26 +8449,40 @@ dependencies = [ "sp-std", ] +[[package]] +name = "sp-tasks" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "log", + "sp-core", + "sp-externalities", + "sp-io", + "sp-runtime-interface", + "sp-std", +] + [[package]] name = "sp-timestamp" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "impl-trait-for-tuples", + "async-trait", + "futures-timer", + "log", "parity-scale-codec", "sp-api", "sp-inherents", "sp-runtime", "sp-std", - "wasm-timer", + "thiserror", ] [[package]] name = "sp-tracing" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "5.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "log", "parity-scale-codec", "sp-std", "tracing", @@ -7243,66 +8492,84 @@ dependencies = [ [[package]] name = "sp-transaction-pool" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "derive_more", - "futures 0.3.15", + "sp-api", + "sp-runtime", +] + +[[package]] +name = "sp-transaction-storage-proof" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "async-trait", "log", "parity-scale-codec", - "serde", - "sp-api", - "sp-blockchain", + "scale-info", + "sp-core", + "sp-inherents", "sp-runtime", + "sp-std", + "sp-trie", ] [[package]] name = "sp-trie" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "hash-db", "memory-db", "parity-scale-codec", + "scale-info", "sp-core", "sp-std", + "thiserror", "trie-db", "trie-root", ] -[[package]] -name = "sp-utils" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "futures 0.3.15", - "futures-core", - "futures-timer 3.0.2", - "lazy_static", - "prometheus", -] - [[package]] name = "sp-version" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "5.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "impl-serde", "parity-scale-codec", + "parity-wasm 0.42.2", + "scale-info", "serde", + "sp-core-hashing-proc-macro", "sp-runtime", "sp-std", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "parity-scale-codec", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "sp-wasm-interface" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "6.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "impl-trait-for-tuples", + "log", "parity-scale-codec", "sp-std", "wasmi", + "wasmtime", ] [[package]] @@ -7311,6 +8578,20 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "ss58-registry" +version = "1.23.0" +source = "git+https://github.com/bwhm/ss58-registry?rev=a70121e7bbb56f983f6f17771cc79d8f19b481a0#a70121e7bbb56f983f6f17771cc79d8f19b481a0" +dependencies = [ + "Inflector", + "num-format", + "proc-macro2", + "quote", + "serde", + "serde_json", + "unicode-xid", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -7325,84 +8606,45 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "statrs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10102ac8d55e35db2b3fafc26f81ba8647da2e15879ab686a67e6d19af2685e8" -dependencies = [ - "rand 0.5.6", -] - -[[package]] -name = "stream-cipher" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80e15f898d8d8f25db24c253ea615cc14acf418ff307822995814e7d42cfa89" -dependencies = [ - "block-cipher", - "generic-array 0.14.4", -] - -[[package]] -name = "string" -version = "0.2.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" +checksum = "05bdbb8e4e78216a85785a85d3ec3183144f98d0097b9281802c019bb07a6f05" dependencies = [ - "bytes 0.4.12", + "approx", + "lazy_static", + "nalgebra", + "num-traits", + "rand 0.8.5", ] [[package]] name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.21" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "structopt-derive" -version = "0.4.14" +name = "strum" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] +checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5" [[package]] name = "strum" -version = "0.16.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" +checksum = "cae14b91c7d11c9a851d3fbc80a963198998c2a64eec840477fa92d8ce9b70bb" dependencies = [ - "strum_macros 0.16.0", + "strum_macros 0.23.1", ] -[[package]] -name = "strum" -version = "0.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5" - [[package]] name = "strum_macros" -version = "0.16.0" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" +checksum = "e61bb0be289045cb80bfce000512e32d09f8337e54c186725da381377ad1f8d5" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro2", "quote", "syn", @@ -7410,115 +8652,120 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.19.4" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e61bb0be289045cb80bfce000512e32d09f8337e54c186725da381377ad1f8d5" +checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" dependencies = [ - "heck", + "heck 0.3.3", "proc-macro2", "quote", + "rustversion", "syn", ] [[package]] name = "substrate-bip39" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed6646a0159b9935b5d045611560eeef842b78d7adc3ba36f5ca325a13a0236" +checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" dependencies = [ - "hmac", - "pbkdf2", + "hmac 0.11.0", + "pbkdf2 0.8.0", "schnorrkel", - "sha2 0.8.2", + "sha2 0.9.9", "zeroize", ] [[package]] -name = "substrate-browser-utils" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "substrate-build-script-utils" +version = "3.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "chrono", - "console_error_panic_hook", - "console_log", - "futures 0.1.31", - "futures 0.3.15", - "futures-timer 3.0.2", - "js-sys", - "kvdb-web", - "libp2p-wasm-ext", - "log", - "rand 0.6.5", - "rand 0.7.3", - "sc-chain-spec", - "sc-informant", - "sc-network", - "sc-service", - "sp-database", - "wasm-bindgen", - "wasm-bindgen-futures", + "platforms", ] [[package]] -name = "substrate-build-script-utils" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +name = "substrate-frame-cli" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "platforms", + "clap 3.2.22", + "frame-support", + "frame-system", + "sc-cli", + "sp-core", + "sp-runtime", ] [[package]] name = "substrate-frame-rpc-system" -version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ "frame-system-rpc-runtime-api", - "futures 0.3.15", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", + "futures", + "jsonrpsee", "log", "parity-scale-codec", "sc-client-api", "sc-rpc-api", - "serde", + "sc-transaction-pool-api", + "serde_json", "sp-api", "sp-block-builder", "sp-blockchain", "sp-core", "sp-runtime", - "sp-transaction-pool", ] [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +version = "0.10.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "async-std", - "derive_more", "futures-util", - "hyper 0.13.10", + "hyper", "log", "prometheus", - "tokio 0.2.25", + "thiserror", + "tokio", +] + +[[package]] +name = "substrate-state-trie-migration-rpc" +version = "4.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" +dependencies = [ + "jsonrpsee", + "log", + "parity-scale-codec", + "sc-client-api", + "sc-rpc-api", + "scale-info", + "serde", + "sp-core", + "sp-io", + "sp-runtime", + "sp-state-machine", + "sp-std", + "sp-trie", + "trie-db", ] [[package]] name = "substrate-test-client" version = "2.0.1" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "futures 0.1.31", - "futures 0.3.15", - "hash-db", + "async-trait", + "futures", "hex", "parity-scale-codec", "sc-client-api", "sc-client-db", "sc-consensus", "sc-executor", - "sc-light", + "sc-offchain", "sc-service", "serde", "serde_json", @@ -7526,6 +8773,7 @@ dependencies = [ "sp-consensus", "sp-core", "sp-keyring", + "sp-keystore", "sp-runtime", "sp-state-machine", ] @@ -7533,10 +8781,10 @@ dependencies = [ [[package]] name = "substrate-test-runtime" version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "cfg-if 0.1.10", - "frame-executive", + "beefy-primitives", + "cfg-if", "frame-support", "frame-system", "frame-system-rpc-runtime-api", @@ -7547,6 +8795,7 @@ dependencies = [ "parity-scale-codec", "parity-util-mem", "sc-service", + "scale-info", "serde", "sp-api", "sp-application-crypto", @@ -7559,516 +8808,359 @@ dependencies = [ "sp-inherents", "sp-io", "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-runtime-interface", - "sp-session", - "sp-state-machine", - "sp-std", - "sp-transaction-pool", - "sp-trie", - "sp-version", - "substrate-wasm-builder-runner", - "trie-db", -] - -[[package]] -name = "substrate-test-runtime-client" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" -dependencies = [ - "futures 0.3.15", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-light", - "sc-service", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "substrate-test-client", - "substrate-test-runtime", -] - -[[package]] -name = "substrate-wasm-builder-runner" -version = "1.0.6" -source = "git+https://github.com/paritytech/substrate.git?rev=2cd20966cc09b059817c3ebe12fc130cdd850d62#2cd20966cc09b059817c3ebe12fc130cdd850d62" - -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" - -[[package]] -name = "subtle" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" - -[[package]] -name = "syn" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "synstructure" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "rand 0.8.4", - "redox_syscall 0.2.8", - "remove_dir_all", - "winapi 0.3.9", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" -dependencies = [ - "thiserror-impl", + "sp-offchain", + "sp-runtime", + "sp-runtime-interface", + "sp-session", + "sp-state-machine", + "sp-std", + "sp-transaction-pool", + "sp-trie", + "sp-version", + "substrate-wasm-builder", + "trie-db", ] [[package]] -name = "thiserror-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +name = "substrate-test-runtime-client" +version = "2.0.0" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "proc-macro2", - "quote", - "syn", + "futures", + "parity-scale-codec", + "sc-block-builder", + "sc-client-api", + "sc-consensus", + "sp-api", + "sp-blockchain", + "sp-consensus", + "sp-core", + "sp-runtime", + "substrate-test-client", + "substrate-test-runtime", ] [[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +name = "substrate-wasm-builder" +version = "5.0.0-dev" +source = "git+https://github.com/joystream/substrate.git?rev=d29a53b11c3e530d1656eef502cb0f1f8fff3522#d29a53b11c3e530d1656eef502cb0f1f8fff3522" dependencies = [ - "once_cell 1.8.0", + "ansi_term", + "build-helper", + "cargo_metadata", + "sp-maybe-compressed-blob", + "strum 0.23.0", + "tempfile", + "toml", + "walkdir", + "wasm-gc-api", ] [[package]] -name = "threadpool" -version = "1.8.1" +name = "subtle" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] -name = "time" -version = "0.1.44" +name = "syn" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "tiny-bip39" -version = "0.7.3" +name = "synstructure" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0165e045cc2ae1660270ca65e1676dbaab60feb0f91b10f7d0665e9b47e31f2" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "failure", - "hmac", - "once_cell 1.8.0", - "pbkdf2", - "rand 0.7.3", - "rustc-hash", - "sha2 0.8.2", - "unicode-normalization", + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] -name = "tiny-keccak" -version = "2.0.2" +name = "system-configuration" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" dependencies = [ - "crunchy", + "bitflags", + "core-foundation", + "system-configuration-sys", ] [[package]] -name = "tinyvec" -version = "1.2.0" +name = "system-configuration-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "tinyvec_macros", + "core-foundation-sys", + "libc", ] [[package]] -name = "tinyvec_macros" -version = "0.1.0" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] -name = "tokio" -version = "0.1.22" +name = "target-lexicon" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "mio", - "num_cpus", - "tokio-codec", - "tokio-current-thread", - "tokio-executor 0.1.10", - "tokio-fs", - "tokio-io", - "tokio-reactor", - "tokio-sync 0.1.8", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "tokio-udp", - "tokio-uds", -] +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" [[package]] -name = "tokio" -version = "0.2.25" +name = "tempfile" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "bytes 0.5.6", - "fnv", - "futures-core", - "iovec", - "lazy_static", + "cfg-if", + "fastrand", "libc", - "memchr", - "mio", - "mio-uds", - "num_cpus", - "pin-project-lite 0.1.12", - "signal-hook-registry", - "slab", - "winapi 0.3.9", + "redox_syscall", + "remove_dir_all", + "winapi", ] [[package]] -name = "tokio-buf" -version = "0.1.1" +name = "termcolor" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ - "bytes 0.4.12", - "either", - "futures 0.1.31", + "winapi-util", ] [[package]] -name = "tokio-codec" -version = "0.1.2" +name = "termtree" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "tokio-io", -] +checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" [[package]] -name = "tokio-current-thread" -version = "0.1.7" +name = "textwrap" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "futures 0.1.31", - "tokio-executor 0.1.10", + "unicode-width", ] [[package]] -name = "tokio-executor" -version = "0.1.10" +name = "textwrap" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", -] +checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" [[package]] -name = "tokio-executor" -version = "0.2.0-alpha.6" +name = "thiserror" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ - "futures-util-preview", - "lazy_static", - "tokio-sync 0.2.0-alpha.6", + "thiserror-impl", ] [[package]] -name = "tokio-fs" -version = "0.1.7" +name = "thiserror-impl" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ - "futures 0.1.31", - "tokio-io", - "tokio-threadpool", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tokio-io" -version = "0.1.13" +name = "thousands" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "log", -] +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" [[package]] -name = "tokio-named-pipes" -version = "0.1.0" +name = "thread_local" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d282d483052288b2308ba5ee795f5673b159c9bdf63c385a05609da782a5eae" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "mio", - "mio-named-pipes", - "tokio 0.1.22", + "once_cell", ] [[package]] -name = "tokio-reactor" -version = "0.1.12" +name = "threadpool" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", - "log", - "mio", "num_cpus", - "parking_lot 0.9.0", - "slab", - "tokio-executor 0.1.10", - "tokio-io", - "tokio-sync 0.1.8", ] [[package]] -name = "tokio-rustls" -version = "0.14.1" +name = "tikv-jemalloc-sys" +version = "0.4.3+5.2.1-patched.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" +checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" dependencies = [ - "futures-core", - "rustls", - "tokio 0.2.25", - "webpki", + "cc", + "fs_extra", + "libc", ] [[package]] -name = "tokio-service" -version = "0.1.0" +name = "time" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ - "futures 0.1.31", + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", ] [[package]] -name = "tokio-sync" -version = "0.1.8" +name = "tiny-bip39" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" dependencies = [ - "fnv", - "futures 0.1.31", + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", ] [[package]] -name = "tokio-sync" -version = "0.2.0-alpha.6" +name = "tinytemplate" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ - "fnv", - "futures-core-preview", - "futures-util-preview", + "serde", + "serde_json", ] [[package]] -name = "tokio-tcp" -version = "0.1.4" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "iovec", - "mio", - "tokio-io", - "tokio-reactor", + "tinyvec_macros", ] [[package]] -name = "tokio-threadpool" -version = "0.1.18" +name = "tinyvec_macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -dependencies = [ - "crossbeam-deque 0.7.3", - "crossbeam-queue", - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", - "log", - "num_cpus", - "slab", - "tokio-executor 0.1.10", -] +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] -name = "tokio-timer" -version = "0.2.13" +name = "tokio" +version = "1.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "slab", - "tokio-executor 0.1.10", + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "parking_lot 0.12.1", + "pin-project-lite 0.2.9", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", ] [[package]] -name = "tokio-udp" -version = "0.1.6" +name = "tokio-macros" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "log", - "mio", - "tokio-codec", - "tokio-io", - "tokio-reactor", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tokio-uds" -version = "0.2.7" +name = "tokio-rustls" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "iovec", - "libc", - "log", - "mio", - "mio-uds", - "tokio-codec", - "tokio-io", - "tokio-reactor", + "rustls", + "tokio", + "webpki", ] [[package]] name = "tokio-util" -version = "0.3.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" dependencies = [ - "bytes 0.5.6", + "bytes", "futures-core", + "futures-io", "futures-sink", - "log", - "pin-project-lite 0.1.12", - "tokio 0.2.25", + "pin-project-lite 0.2.9", + "tokio", + "tracing", ] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.26" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite 0.2.6", + "cfg-if", + "pin-project-lite 0.2.9", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.15" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", @@ -8077,11 +9169,12 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.18" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ - "lazy_static", + "once_cell", + "valuable", ] [[package]] @@ -8090,26 +9183,28 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 1.0.7", + "pin-project 1.0.12", "tracing", ] [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ + "ahash", "lazy_static", "log", + "lru", "tracing-core", ] [[package]] name = "tracing-serde" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" dependencies = [ "serde", "tracing-core", @@ -8117,19 +9212,20 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.18" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa5553bf0883ba7c9cbe493b085c29926bd41b66afc31ff72cf17ff4fb60dcd5" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" dependencies = [ - "ansi_term 0.12.1", + "ansi_term", "chrono", "lazy_static", "matchers", + "parking_lot 0.11.2", "regex", "serde", "serde_json", "sharded-slab", - "smallvec 1.6.1", + "smallvec", "thread_local", "tracing", "tracing-core", @@ -8139,58 +9235,114 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.22.5" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd81fe0c8bc2b528a51c9d2c31dae4483367a26a723a3c9a4a8120311d7774e3" +checksum = "d32d034c0d3db64b43c31de38e945f15b40cd4ca6d2dcfc26d4798ce8de4ab83" dependencies = [ "hash-db", - "hashbrown 0.9.1", + "hashbrown", "log", "rustc-hex", - "smallvec 1.6.1", + "smallvec", ] [[package]] name = "trie-root" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "652931506d2c1244d7217a70b99f56718a7b4161b37f04e7cd868072a99f68cd" +checksum = "9a36c5ca3911ed3c9a5416ee6c679042064b93fc637ded67e25f92e68d783891" dependencies = [ "hash-db", ] +[[package]] +name = "trust-dns-proto" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "log", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "trust-dns-proto", +] + [[package]] name = "try-lock" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "tt-call" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e66dcbec4290c69dd03c57e76c2469ea5c7ce109c6dd4351c13055cf71ea055" + [[package]] name = "twox-hash" -version = "1.6.0" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 0.1.10", - "rand 0.7.3", + "cfg-if", + "digest 0.10.5", + "rand 0.8.5", "static_assertions", ] [[package]] name = "typenum" -version = "1.13.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "uint" -version = "0.8.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" +checksum = "a45526d29728d135c2900b0d30573fe3ee79fceb12ef534c7bb30e810a91b601" dependencies = [ - "byteorder 1.4.3", + "byteorder", "crunchy", - "rustc-hex", + "hex", "static_assertions", ] @@ -8205,68 +9357,61 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "universal-hash" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" -dependencies = [ - "generic-array 0.14.4", - "subtle 2.4.0", -] - -[[package]] -name = "unsigned-varint" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ - "bytes 0.5.6", - "futures-io", - "futures-util", - "futures_codec", + "generic-array 0.14.6", + "subtle", ] [[package]] name = "unsigned-varint" -version = "0.5.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" dependencies = [ + "asynchronous-codec", + "bytes", "futures-io", "futures-util", ] @@ -8279,54 +9424,52 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "1.7.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", + "form_urlencoded", + "idna 0.3.0", + "percent-encoding", ] [[package]] -name = "url" -version = "2.2.2" +name = "valuable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna 0.2.3", - "matches", - "percent-encoding 2.1.0", -] +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.0.0-alpha.7" +version = "1.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd320e1520f94261153e96f7534476ad869c14022aee1e59af7c778075d840ae" +checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" dependencies = [ "ctor", "version_check", ] [[package]] -name = "vcpkg" -version = "0.2.14" +name = "variant_count" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70455df2fdf4e9bf580a92e443f1eb0303c390d682e2ea817312c9e81f8c3399" +checksum = "aae2faf80ac463422992abf4de234731279c058aaf33171ca70277c98406b124" +dependencies = [ + "quote", + "syn", +] [[package]] -name = "vec_map" -version = "0.8.2" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "void" @@ -8334,6 +9477,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -8341,14 +9493,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] -name = "want" -version = "0.2.0" +name = "walkdir" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ - "futures 0.1.31", - "log", - "try-lock", + "same-file", + "winapi", + "winapi-util", ] [[package]] @@ -8373,25 +9525,31 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -8400,11 +9558,11 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.24" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -8412,9 +9570,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8422,9 +9580,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", @@ -8435,9 +9593,29 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "wasm-gc-api" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "d0c32691b6c7e6c14e7f8fd55361a9088b507aa49620fcd06c09b3a1082186b9" +dependencies = [ + "log", + "parity-wasm 0.32.0", + "rustc-demangle", +] + +[[package]] +name = "wasm-instrument" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962e5b0401bbb6c887f54e69b8c496ea36f704df65db73e81fd5ff8dc3e63a9f" +dependencies = [ + "parity-wasm 0.42.2", +] [[package]] name = "wasm-timer" @@ -8445,9 +9623,9 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ - "futures 0.3.15", + "futures", "js-sys", - "parking_lot 0.11.1", + "parking_lot 0.11.2", "pin-utils", "wasm-bindgen", "wasm-bindgen-futures", @@ -8456,32 +9634,208 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.6.2" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" +checksum = "ca00c5147c319a8ec91ec1a0edbec31e566ce2c9cc93b3f9bb86a9efd0eb795d" dependencies = [ + "downcast-rs", "libc", + "libm", "memory_units", - "num-rational", + "num-rational 0.2.4", "num-traits", - "parity-wasm", + "parity-wasm 0.42.2", "wasmi-validation", ] [[package]] name = "wasmi-validation" -version = "0.3.0" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165343ecd6c018fc09ebcae280752702c9a2ef3e6f8d02f1cfcbdb53ef6d7937" +dependencies = [ + "parity-wasm 0.42.2", +] + +[[package]] +name = "wasmparser" +version = "0.83.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" + +[[package]] +name = "wasmtime" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ffb4705016d5ca91e18a72ed6822dab50e6d5ddd7045461b17ef19071cdef1" +dependencies = [ + "anyhow", + "backtrace", + "bincode", + "cfg-if", + "indexmap", + "lazy_static", + "libc", + "log", + "object 0.27.1", + "once_cell", + "paste 1.0.9", + "psm", + "rayon", + "region", + "serde", + "target-lexicon", + "wasmparser", + "wasmtime-cache", + "wasmtime-cranelift", + "wasmtime-environ", + "wasmtime-jit", + "wasmtime-runtime", + "winapi", +] + +[[package]] +name = "wasmtime-cache" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c6ab24291fa7cb3a181f5669f6c72599b7ef781669759b45c7828c5999d0c0" +dependencies = [ + "anyhow", + "base64", + "bincode", + "directories-next", + "file-per-thread-logger", + "log", + "rustix", + "serde", + "sha2 0.9.9", + "toml", + "winapi", + "zstd", +] + +[[package]] +name = "wasmtime-cranelift" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04c810078a491b7bc4866ebe045f714d2b95e6b539e1f64009a4a7606be11de" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "cranelift-native", + "cranelift-wasm", + "gimli", + "log", + "more-asserts", + "object 0.27.1", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-environ", +] + +[[package]] +name = "wasmtime-environ" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61448266ea164b1ac406363cdcfac81c7c44db4d94c7a81c8620ac6c5c6cdf59" +dependencies = [ + "anyhow", + "cranelift-entity", + "gimli", + "indexmap", + "log", + "more-asserts", + "object 0.27.1", + "serde", + "target-lexicon", + "thiserror", + "wasmparser", + "wasmtime-types", +] + +[[package]] +name = "wasmtime-jit" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "156b4623c6b0d4b8c24afb846c20525922f538ef464cc024abab7ea8de2109a2" +dependencies = [ + "addr2line", + "anyhow", + "bincode", + "cfg-if", + "cpp_demangle", + "gimli", + "log", + "object 0.27.1", + "region", + "rustc-demangle", + "rustix", + "serde", + "target-lexicon", + "thiserror", + "wasmtime-environ", + "wasmtime-jit-debug", + "wasmtime-runtime", + "winapi", +] + +[[package]] +name = "wasmtime-jit-debug" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5dc31f811760a6c76b2672c404866fd19b75e5fb3b0075a3e377a6846490654" +dependencies = [ + "lazy_static", + "object 0.27.1", + "rustix", +] + +[[package]] +name = "wasmtime-runtime" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f907beaff69d4d920fa4688411ee4cc75c0f01859e424677f9e426e2ef749864" +dependencies = [ + "anyhow", + "backtrace", + "cc", + "cfg-if", + "indexmap", + "libc", + "log", + "mach", + "memfd", + "memoffset", + "more-asserts", + "rand 0.8.5", + "region", + "rustix", + "thiserror", + "wasmtime-environ", + "wasmtime-jit-debug", + "winapi", +] + +[[package]] +name = "wasmtime-types" +version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" +checksum = "514ef0e5fd197b9609dc9eb74beba0c84d5a12b2417cbae55534633329ba4852" dependencies = [ - "parity-wasm", + "cranelift-entity", + "serde", + "thiserror", + "wasmparser", ] [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" dependencies = [ "js-sys", "wasm-bindgen", @@ -8489,9 +9843,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.21.4" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" dependencies = [ "ring", "untrusted", @@ -8499,18 +9853,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.19.0" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eff4b7516a57307f9349c64bf34caa34b940b66fed4b2fb3136cb7386e5739" +checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" dependencies = [ "webpki", ] @@ -8526,18 +9871,20 @@ dependencies = [ [[package]] name = "which" -version = "3.1.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" dependencies = [ + "either", "libc", + "once_cell", ] [[package]] -name = "winapi" -version = "0.2.8" +name = "widestring" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "winapi" @@ -8549,18 +9896,21 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -8568,24 +9918,107 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "windows" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", ] [[package]] -name = "x25519-dalek" -version = "0.6.0" +name = "windows-sys" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "curve25519-dalek 2.1.2", - "rand_core 0.5.1", - "zeroize", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", ] [[package]] @@ -8594,42 +10027,71 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" dependencies = [ - "curve25519-dalek 3.1.0", + "curve25519-dalek 3.2.0", "rand_core 0.5.1", "zeroize", ] [[package]] name = "yamux" -version = "0.8.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cc7bd8c983209ed5d527f44b01c41b7dc146fd960c61cf9e1d25399841dc271" +checksum = "e5d9ba232399af1783a58d8eb26f6b5006fbefe2dc9ef36bd283324792d03ea5" dependencies = [ - "futures 0.3.15", + "futures", "log", "nohash-hasher", - "parking_lot 0.11.1", - "rand 0.7.3", + "parking_lot 0.12.1", + "rand 0.8.5", "static_assertions", ] [[package]] name = "zeroize" -version = "1.3.0" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.1.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1" +checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", "quote", "syn", "synstructure", ] + +[[package]] +name = "zstd" +version = "0.10.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4a6bd64f22b5e3e94b4e238669ff9f10815c27a5180108b849d24174a83847" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.6+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b61c51bb270702d6167b8ce67340d2754b088d0c091b06e593aa772c3ee9bb" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.3+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" +dependencies = [ + "cc", + "libc", +] diff --git a/Cargo.toml b/Cargo.toml index 7eb2368ff8..ddd2be46eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,10 +15,14 @@ members = [ "runtime-modules/constitution", "runtime-modules/staking-handler", "runtime-modules/bounty", - "runtime-modules/blog", "runtime-modules/utility", - "node", - "utils/chain-spec-builder/", + "runtime-modules/project-token", + "bin/node", + "bin/inspect", + "bin/utils/chain-spec-builder/", + "bin/utils/session-keys/", + "bin/utils/call-sizes/", + "runtime-modules/support/derive-fixture", ] exclude = [ "analyses/bench" @@ -27,3 +31,6 @@ exclude = [ [profile.release] # Substrate runtime requires unwinding. panic = "unwind" + +[patch.crates-io] +ss58-registry = { package = 'ss58-registry', git = 'https://github.com/bwhm/ss58-registry', rev = 'a70121e7bbb56f983f6f17771cc79d8f19b481a0'} diff --git a/README.md b/README.md index 67e6cd6c69..5866861328 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ This is the main code repository for all Joystream software. In this mono-repo y ## Overview -The Joystream network builds on a pre-release version of [substrate v2.0](https://substrate.dev/) and adds additional -functionality to support the [various roles](https://www.joystream.org/roles) that can be entered into on the platform. +The Joystream network builds on the [substrate](https://substrate.io/) blockchain framework, and adds additional +functionality to support the [various roles](https://joystream.gitbook.io/testnet-workspace/system/working-groups) that can be entered into on the platform. -## Development Tools +## Development The following tools are required for building, testing and contributing to this repo: @@ -22,7 +22,7 @@ If you use VSCode as your code editor we recommend using the workspace [settings After cloning the repo run the following initialization scripts: ```sh -# Install rust toolchain +# Install development tools ./setup.sh # build local npm packages @@ -39,7 +39,7 @@ yarn start **Substrate blockchain** -- [joystream-node](./node) +- [joystream-node](./bin/node) - [runtime](./runtime) - [runtime modules](./runtime-modules) @@ -66,13 +66,13 @@ yarn start ```sh git checkout master -WASM_BUILD_TOOLCHAIN=nightly-2021-02-20 cargo +nightly-2021-02-20 build --release -./target/release/joystream-node -- --pruning archive --chain testnets/joy-testnet-6.json +WASM_BUILD_TOOLCHAIN=nightly-2022-05-11 cargo build --release +./target/release/joystream-node -- --pruning archive --chain joy-mainnet.json ``` -Learn more about [joystream-node](node/README.md). +Learn more about [joystream-node](bin/node/README.md). -A step by step guide to setup a full node and validator on the Joystream testnet, can be found [here](https://github.com/Joystream/helpdesk/tree/master/roles/validators). +A step by step guide to setup a full node and validator on the Joystream testnet, can be found [here](https://joystream.gitbook.io/testnet-workspace/system/validation#validator). ### Integration tests diff --git a/analyses/bench/Cargo.lock b/analyses/bench/Cargo.lock deleted file mode 100644 index 5e7708f867..0000000000 --- a/analyses/bench/Cargo.lock +++ /dev/null @@ -1,8319 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" - -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "aes" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd2bc6d3f370b5666245ff421e231cba4353df936e26986d2918e61a8fd6aef6" -dependencies = [ - "aes-soft", - "aesni", - "block-cipher", -] - -[[package]] -name = "aes-gcm" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0301c9e9c443494d970a07885e8cf3e587bae8356a1d5abd0999068413f7205f" -dependencies = [ - "aead", - "aes", - "block-cipher", - "ghash", - "subtle 2.3.0", -] - -[[package]] -name = "aes-soft" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63dd91889c49327ad7ef3b500fd1109dbd3c509a03db0d4a9ce413b79f575cb6" -dependencies = [ - "block-cipher", - "byteorder 1.3.4", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6fe808308bb07d393e2ea47780043ec47683fcf19cf5efc8ca51c50cc8c68a" -dependencies = [ - "block-cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "ahash" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29661b60bec623f0586702976ff4d0c9942dcb6723161c2df0eea78455cfedfb" -dependencies = [ - "const-random", -] - -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" - -[[package]] -name = "ahash" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6789e291be47ace86a60303502173d84af8327e3627ecf334356ee0f87a164c" - -[[package]] -name = "aho-corasick" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" -dependencies = [ - "memchr", -] - -[[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex", - "num-traits", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "anyhow" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" - -[[package]] -name = "approx" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -dependencies = [ - "num-traits", -] - -[[package]] -name = "arc-swap" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -dependencies = [ - "nodrop", -] - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "asn1_der" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fce6b6a0ffdafebd82c87e79e3f40e8d2c523e5fea5566ff6b90509bf98d638" -dependencies = [ - "asn1_der_derive", -] - -[[package]] -name = "asn1_der_derive" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "async-channel" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell 1.5.2", - "vec-arena", -] - -[[package]] -name = "async-global-executor" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73079b49cd26b8fd5a15f68fc7707fc78698dc2a3d61430f2a7a9430230dfa04" -dependencies = [ - "async-executor", - "async-io", - "futures-lite", - "num_cpus", - "once_cell 1.5.2", -] - -[[package]] -name = "async-io" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" -dependencies = [ - "concurrent-queue", - "fastrand", - "futures-lite", - "libc", - "log", - "nb-connect", - "once_cell 1.5.2", - "parking", - "polling", - "vec-arena", - "waker-fn", - "winapi 0.3.9", -] - -[[package]] -name = "async-mutex" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-std" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e82538bc65a25dbdff70e4c5439d52f068048ab97cdea0acd73f131594caa1" -dependencies = [ - "async-global-executor", - "async-io", - "async-mutex", - "blocking", - "crossbeam-utils 0.8.1", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "num_cpus", - "once_cell 1.5.2", - "pin-project-lite 0.1.11", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" - -[[package]] -name = "async-tls" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df097e3f506bec0e1a24f06bb3c962c228f36671de841ff579cb99f371772634" -dependencies = [ - "futures 0.3.8", - "rustls", - "webpki", - "webpki-roots 0.19.0", -] - -[[package]] -name = "async-trait" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "atomic" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f46ca51dca4837f1520754d1c8c36636356b81553d928dc9c177025369a06e" - -[[package]] -name = "atomic-waker" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "backtrace" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" -dependencies = [ - "addr2line", - "cfg-if 1.0.0", - "libc", - "miniz_oxide 0.4.3", - "object", - "rustc-demangle", -] - -[[package]] -name = "base58" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" - -[[package]] -name = "base64" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bindgen" -version = "0.54.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c0bb6167449588ff70803f4127f0684f9063097eca5016f37eb52b92c2cf36" -dependencies = [ - "bitflags", - "cexpr", - "cfg-if 0.1.10", - "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - -[[package]] -name = "bip39" -version = "0.6.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059804e226b3ac116519a252d7f5fb985a5ccc0e93255e036a5f7e7283323f4" -dependencies = [ - "failure", - "hashbrown 0.1.8", - "hmac", - "once_cell 0.1.8", - "pbkdf2", - "rand 0.6.5", - "sha2 0.8.2", -] - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" - -[[package]] -name = "bitmask" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" - -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium", -] - -[[package]] -name = "blake2" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a5720225ef5daecf08657f23791354e1685a8c91a4c60c7f3d3b2892f978f4" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "blake2-rfc" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -dependencies = [ - "arrayvec 0.4.12", - "constant_time_eq", -] - -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake2s_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder 1.3.4", - "generic-array 0.12.3", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding 0.2.1", - "generic-array 0.14.4", -] - -[[package]] -name = "block-cipher" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f337a3e6da609650eb74e02bc9fac7b735049f7623ab12f2e4c719316fcc7e80" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "blocking" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9" -dependencies = [ - "async-channel", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "once_cell 1.5.2", -] - -[[package]] -name = "bs58" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bstr" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473fc6b38233f9af7baa94fb5852dca389e3d95b8e21c8e3719301462c5d9faf" -dependencies = [ - "memchr", -] - -[[package]] -name = "bumpalo" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" - -[[package]] -name = "byte-slice-cast" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "bytemuck" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed57e2090563b83ba8f83366628ce535a7584c9afa4c9fc0612a03925c6df58" - -[[package]] -name = "byteorder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" - -[[package]] -name = "byteorder" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" - -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder 1.3.4", - "either", - "iovec", -] - -[[package]] -name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - -[[package]] -name = "c_linked_list" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" - -[[package]] -name = "cache-padded" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - -[[package]] -name = "cc" -version = "1.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chacha20" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244fbce0d47e97e8ef2f63b81d5e05882cb518c68531eb33194990d7b7e85845" -dependencies = [ - "stream-cipher", - "zeroize", -] - -[[package]] -name = "chacha20poly1305" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bf18d374d66df0c05cdddd528a7db98f78c28e2519b120855c4f84c5027b1f5" -dependencies = [ - "aead", - "chacha20", - "poly1305", - "stream-cipher", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi 0.3.9", -] - -[[package]] -name = "clang-sys" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "2.33.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" -dependencies = [ - "ansi_term 0.11.0", - "atty", - "bitflags", - "strsim", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "cloudabi" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" -dependencies = [ - "bitflags", -] - -[[package]] -name = "cmake" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855" -dependencies = [ - "cc", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "const-random" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486d435a7351580347279f374cb8a3c16937485441db80181357b7c4d70f17ed" -dependencies = [ - "const-random-macro", - "proc-macro-hack", -] - -[[package]] -name = "const-random-macro" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a84d8ff70e3ec52311109b019c27672b4c1929e4cf7c18bcf0cd9fb5e230be" -dependencies = [ - "getrandom 0.2.0", - "lazy_static", - "proc-macro-hack", - "tiny-keccak", -] - -[[package]] -name = "const_fn" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags", - "core-foundation", - "foreign-types", - "libc", -] - -[[package]] -name = "core-text" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "131b3fd1f8bd5db9f2b398fa4fdb6008c64afc04d447c306ac2c7e98fba2a61d" -dependencies = [ - "core-foundation", - "core-graphics", - "foreign-types", - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" - -[[package]] -name = "crc32fast" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.1", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -dependencies = [ - "crossbeam-epoch 0.8.2", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch 0.9.1", - "crossbeam-utils 0.8.1", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -dependencies = [ - "autocfg 1.0.1", - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "lazy_static", - "maybe-uninit", - "memoffset 0.5.6", - "scopeguard 1.1.0", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" -dependencies = [ - "cfg-if 1.0.0", - "const_fn", - "crossbeam-utils 0.8.1", - "lazy_static", - "memoffset 0.6.1", - "scopeguard 1.1.0", -] - -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -dependencies = [ - "autocfg 1.0.1", - "cfg-if 0.1.10", - "lazy_static", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" -dependencies = [ - "autocfg 1.0.1", - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-mac" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -dependencies = [ - "generic-array 0.12.3", - "subtle 1.0.0", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.4", - "subtle 2.3.0", -] - -[[package]] -name = "ct-logs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c8e13110a84b6315df212c045be706af261fd364791cad863285439ebba672e" -dependencies = [ - "sct", -] - -[[package]] -name = "cuckoofilter" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -dependencies = [ - "byteorder 0.5.3", - "rand 0.3.23", -] - -[[package]] -name = "curve25519-dalek" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" -dependencies = [ - "byteorder 1.3.4", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.3.0", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8492de420e9e60bc9a1d66e2dbb91825390b738a388606600663fc529b4b307" -dependencies = [ - "byteorder 1.3.4", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle 2.3.0", - "zeroize", -] - -[[package]] -name = "data-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993a608597367c6377b258c25d7120740f00ed23a2252b729b1932dd7866f908" - -[[package]] -name = "deflate" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" -dependencies = [ - "adler32", - "byteorder 1.3.4", -] - -[[package]] -name = "deflate" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" -dependencies = [ - "adler32", - "byteorder 1.3.4", -] - -[[package]] -name = "derive_more" -version = "0.99.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.3", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "directories" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - -[[package]] -name = "dns-parser" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" -dependencies = [ - "byteorder 1.3.4", - "quick-error", -] - -[[package]] -name = "dwrote" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439a1c2ba5611ad3ed731280541d36d2e9c4ac5e7fb818a27b604bdc5a6aa65b" -dependencies = [ - "lazy_static", - "libc", - "winapi 0.3.9", - "wio", -] - -[[package]] -name = "dyn-clonable" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" -dependencies = [ - "dyn-clonable-impl", - "dyn-clone", -] - -[[package]] -name = "dyn-clonable-impl" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dyn-clone" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d55796afa1b20c2945ca8eabfc421839f2b766619209f1ede813cf2484f31804" - -[[package]] -name = "ed25519" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c66a534cbb46ab4ea03477eae19d5c22c01da8258030280b7bd9d8433fb6ef" -dependencies = [ - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.0.0", - "ed25519", - "rand 0.7.3", - "serde", - "sha2 0.9.2", - "zeroize", -] - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "environmental" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6576a1755ddffd988788025e75bce9e74b018f7cc226198fe931d077911c6d7e" - -[[package]] -name = "erased-serde" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ca8b296792113e1500fd935ae487be6e00ce318952a6880555554824d6ebf38" -dependencies = [ - "serde", -] - -[[package]] -name = "event-listener" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "exit-future" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" -dependencies = [ - "futures 0.3.8", -] - -[[package]] -name = "expat-sys" -version = "2.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa" -dependencies = [ - "cmake", - "pkg-config", -] - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fastrand" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3" -dependencies = [ - "instant", -] - -[[package]] -name = "fdlimit" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4c9e43643f5a3be4ca5b67d26b98031ff9db6806c3440ae32e02e3ceac3f1b" -dependencies = [ - "libc", -] - -[[package]] -name = "finality-grandpa" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" -dependencies = [ - "either", - "futures 0.3.8", - "futures-timer 2.0.2", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.9.0", -] - -[[package]] -name = "fixed-hash" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" -dependencies = [ - "byteorder 1.3.4", - "rand 0.7.3", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" - -[[package]] -name = "flate2" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129" -dependencies = [ - "cfg-if 1.0.0", - "crc32fast", - "libc", - "libz-sys", - "miniz_oxide 0.4.3", -] - -[[package]] -name = "float-ord" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "font-kit" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ab2cdc792b545c49acb23aafa1cdc9381ea96140741f10bac596fd1bd1aa4f" -dependencies = [ - "bitflags", - "byteorder 1.3.4", - "core-foundation", - "core-graphics", - "core-text", - "dirs", - "dwrote", - "float-ord", - "freetype", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "servo-fontconfig", - "walkdir", - "winapi 0.3.9", -] - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "fork-tree" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "form_urlencoded" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" -dependencies = [ - "matches", - "percent-encoding 2.1.0", -] - -[[package]] -name = "frame-benchmarking" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "linregress 0.1.7", - "parity-scale-codec", - "paste", - "sp-api", - "sp-io", - "sp-runtime", - "sp-runtime-interface", - "sp-std", - "sp-storage", -] - -[[package]] -name = "frame-executive" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "frame-metadata" -version = "12.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core", - "sp-std", -] - -[[package]] -name = "frame-support" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "bitmask", - "frame-metadata", - "frame-support-procedural", - "impl-trait-for-tuples", - "log", - "once_cell 1.5.2", - "parity-scale-codec", - "paste", - "serde", - "smallvec 1.6.0", - "sp-arithmetic", - "sp-core", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-tracing", -] - -[[package]] -name = "frame-support-procedural" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support-procedural-tools", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "frame-support-procedural-tools" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support-procedural-tools-derive", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "frame-support-procedural-tools-derive" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "frame-system" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "impl-trait-for-tuples", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", - "sp-version", -] - -[[package]] -name = "frame-system-rpc-runtime-api" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-api", -] - -[[package]] -name = "freetype" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11926b2b410b469d0e9399eca4cbbe237a9ef02176c485803b29216307e8e028" -dependencies = [ - "libc", - "servo-freetype-sys", -] - -[[package]] -name = "fs-swap" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5839fda247e24ca4919c87c71dd5ca658f1f39e4f06829f80e3f15c3bafcfc2c" -dependencies = [ - "lazy_static", - "libc", - "libloading", - "winapi 0.3.9", -] - -[[package]] -name = "fs_extra" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - -[[package]] -name = "futures" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed" - -[[package]] -name = "futures" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-channel-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e5f4df964fa9c1c2f8bddeb5c3611631cacd93baf810fc8bb2fb4b495c263a" -dependencies = [ - "futures-core-preview", -] - -[[package]] -name = "futures-core" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748" - -[[package]] -name = "futures-core-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35b6263fb1ef523c3056565fa67b1d16f0a8604ff12b11b08c25f28a734c60a" - -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -dependencies = [ - "futures 0.1.30", - "num_cpus", -] - -[[package]] -name = "futures-diagnose" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" -dependencies = [ - "futures 0.1.30", - "futures 0.3.8", - "lazy_static", - "log", - "parking_lot 0.9.0", - "pin-project 0.4.27", - "serde", - "serde_json", -] - -[[package]] -name = "futures-executor" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", - "num_cpus", -] - -[[package]] -name = "futures-io" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb" - -[[package]] -name = "futures-lite" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6c079abfac3ab269e2927ec048dabc89d009ebfdda6b8ee86624f30c689658" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite 0.1.11", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d" - -[[package]] -name = "futures-task" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d" -dependencies = [ - "once_cell 1.5.2", -] - -[[package]] -name = "futures-timer" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" - -[[package]] -name = "futures-util" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2" -dependencies = [ - "futures 0.1.30", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project 1.0.2", - "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", -] - -[[package]] -name = "futures-util-preview" -version = "0.3.0-alpha.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce968633c17e5f97936bd2797b6e38fb56cf16a7422319f7ec2e30d3c470e8d" -dependencies = [ - "futures-channel-preview", - "futures-core-preview", - "pin-utils", - "slab", -] - -[[package]] -name = "futures_codec" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce54d63f8b0c75023ed920d46fd71d0cbbb830b0ee012726b5b4f506fb6dea5b" -dependencies = [ - "bytes 0.5.6", - "futures 0.3.8", - "memchr", - "pin-project 0.4.27", -] - -[[package]] -name = "gcc" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - -[[package]] -name = "generator" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cdc09201b2e8ca1b19290cf7e65de2246b8e91fb6874279722189c4de7b94dc" -dependencies = [ - "cc", - "libc", - "log", - "rustc_version", - "winapi 0.3.9", -] - -[[package]] -name = "generic-array" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "get_if_addrs" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" -dependencies = [ - "c_linked_list", - "get_if_addrs-sys", - "libc", - "winapi 0.2.8", -] - -[[package]] -name = "get_if_addrs-sys" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" -dependencies = [ - "gcc", - "libc", -] - -[[package]] -name = "getrandom" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6e27f0689a6e15944bdce7e45425efb87eaa8ab0c6e87f11d0987a9133e2531" -dependencies = [ - "polyval", -] - -[[package]] -name = "gif" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af" -dependencies = [ - "color_quant", - "lzw", -] - -[[package]] -name = "gimli" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "gloo-timers" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "h2" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -dependencies = [ - "byteorder 1.3.4", - "bytes 0.4.12", - "fnv", - "futures 0.1.30", - "http 0.1.21", - "indexmap", - "log", - "slab", - "string", - "tokio-io", -] - -[[package]] -name = "h2" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" -dependencies = [ - "bytes 0.5.6", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.1", - "indexmap", - "slab", - "tokio 0.2.23", - "tokio-util", - "tracing", - "tracing-futures", -] - -[[package]] -name = "hash-db" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" - -[[package]] -name = "hash256-std-hasher" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c171d55b98633f4ed3860808f004099b36c1cc29c42cfc53aa8591b21efcf2" -dependencies = [ - "crunchy", -] - -[[package]] -name = "hashbrown" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" -dependencies = [ - "byteorder 1.3.4", - "scopeguard 0.3.3", -] - -[[package]] -name = "hashbrown" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6073d0ca812575946eb5f35ff68dbe519907b25c42530389ff946dc84c6ead" -dependencies = [ - "ahash 0.2.19", - "autocfg 0.1.7", -] - -[[package]] -name = "hashbrown" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" -dependencies = [ - "ahash 0.3.8", - "autocfg 1.0.1", -] - -[[package]] -name = "hashbrown" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" -dependencies = [ - "ahash 0.4.6", -] - -[[package]] -name = "heck" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" -dependencies = [ - "libc", -] - -[[package]] -name = "hex" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" - -[[package]] -name = "hex-literal" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af1f635ef1bc545d78392b136bfe1c9809e029023c84a3638a864a10b8819c8" - -[[package]] -name = "hex_fmt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" - -[[package]] -name = "hmac" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" -dependencies = [ - "crypto-mac 0.7.0", - "digest 0.8.1", -] - -[[package]] -name = "hmac-drbg" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e570451493f10f6581b48cdd530413b63ea9e780f544bfd3bdcaa0d89d1a7b" -dependencies = [ - "digest 0.8.1", - "generic-array 0.12.3", - "hmac", -] - -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" -dependencies = [ - "bytes 0.5.6", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "http 0.1.21", - "tokio-buf", -] - -[[package]] -name = "http-body" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" -dependencies = [ - "bytes 0.5.6", - "http 0.2.1", -] - -[[package]] -name = "httparse" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" - -[[package]] -name = "httpdate" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - -[[package]] -name = "hyper" -version = "0.12.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "futures-cpupool", - "h2 0.1.26", - "http 0.1.21", - "http-body 0.1.0", - "httparse", - "iovec", - "itoa", - "log", - "net2", - "rustc_version", - "time", - "tokio 0.1.22", - "tokio-buf", - "tokio-executor 0.1.10", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "want 0.2.0", -] - -[[package]] -name = "hyper" -version = "0.13.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ad767baac13b44d4529fcf58ba2cd0995e36e7b435bc5b039de6f47e880dbf" -dependencies = [ - "bytes 0.5.6", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.2.7", - "http 0.2.1", - "http-body 0.3.1", - "httparse", - "httpdate", - "itoa", - "pin-project 1.0.2", - "socket2", - "tokio 0.2.23", - "tower-service", - "tracing", - "want 0.3.0", -] - -[[package]] -name = "hyper-rustls" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37743cc83e8ee85eacfce90f2f4102030d9ff0a95244098d781e9bee4a90abb6" -dependencies = [ - "bytes 0.5.6", - "ct-logs", - "futures-util", - "hyper 0.13.9", - "log", - "rustls", - "rustls-native-certs", - "tokio 0.2.23", - "tokio-rustls", - "webpki", -] - -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "image" -version = "0.22.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08ed2ada878397b045454ac7cfb011d73132c59f31a955d230bd1f1c2e68eb4a" -dependencies = [ - "byteorder 1.3.4", - "jpeg-decoder", - "num-iter", - "num-rational 0.2.4", - "num-traits", - "png 0.15.3", -] - -[[package]] -name = "image" -version = "0.23.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" -dependencies = [ - "bytemuck", - "byteorder 1.3.4", - "color_quant", - "jpeg-decoder", - "num-iter", - "num-rational 0.3.2", - "num-traits", - "png 0.16.8", -] - -[[package]] -name = "impl-codec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-serde" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "indexmap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" -dependencies = [ - "autocfg 1.0.1", - "hashbrown 0.9.1", -] - -[[package]] -name = "inflate" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" -dependencies = [ - "adler32", -] - -[[package]] -name = "instant" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" -dependencies = [ - "num-traits", -] - -[[package]] -name = "intervalier" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" -dependencies = [ - "futures 0.3.8", - "futures-timer 2.0.2", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - -[[package]] -name = "ip_network" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee15951c035f79eddbef745611ec962f63f4558f1dadf98ab723cc603487c6f" - -[[package]] -name = "ipnet" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" - -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" - -[[package]] -name = "jobserver" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" -dependencies = [ - "libc", -] - -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" - -[[package]] -name = "js-sys" -version = "0.3.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpc-client-transports" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489b9c612e60c766f751ab40fcb43cbb55a1e10bb44a9b4307ed510ca598cbd7" -dependencies = [ - "failure", - "futures 0.1.30", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "serde", - "serde_json", - "url 1.7.2", -] - -[[package]] -name = "jsonrpc-core" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0745a6379e3edc893c84ec203589790774e4247420033e71a76d3ab4687991fa" -dependencies = [ - "futures 0.1.30", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core-client" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f764902d7b891344a0acb65625f32f6f7c6db006952143bd650209fbe7d94db" -dependencies = [ - "jsonrpc-client-transports", -] - -[[package]] -name = "jsonrpc-derive" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a847f9ec7bb52149b2786a17c9cb260d6effc6b8eeb8c16b343a487a7563a3" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "jsonrpc-http-server" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb5c4513b7b542f42da107942b7b759f27120b5cc894729f88254b28dff44b7" -dependencies = [ - "hyper 0.12.35", - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "net2", - "parking_lot 0.10.2", - "unicase", -] - -[[package]] -name = "jsonrpc-ipc-server" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf50e53e4eea8f421a7316c5f63e395f7bc7c4e786a6dc54d76fab6ff7aa7ce7" -dependencies = [ - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-tokio-ipc", - "parking_lot 0.10.2", - "tokio-service", -] - -[[package]] -name = "jsonrpc-pubsub" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "639558e0604013be9787ae52f798506ae42bf4220fe587bdc5625871cc8b9c77" -dependencies = [ - "jsonrpc-core", - "log", - "parking_lot 0.10.2", - "rand 0.7.3", - "serde", -] - -[[package]] -name = "jsonrpc-server-utils" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f1f3990650c033bd8f6bd46deac76d990f9bbfb5f8dc8c4767bf0a00392176" -dependencies = [ - "bytes 0.4.12", - "globset", - "jsonrpc-core", - "lazy_static", - "log", - "tokio 0.1.22", - "tokio-codec", - "unicase", -] - -[[package]] -name = "jsonrpc-ws-server" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6596fe75209b73a2a75ebe1dce4e60e03b88a2b25e8807b667597f6315150d22" -dependencies = [ - "jsonrpc-core", - "jsonrpc-server-utils", - "log", - "parity-ws", - "parking_lot 0.10.2", - "slab", -] - -[[package]] -name = "keccak" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "kvdb" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0315ef2f688e33844400b31f11c263f2b3dc21d8b9355c6891c5f185fae43f9a" -dependencies = [ - "parity-util-mem", - "smallvec 1.6.0", -] - -[[package]] -name = "kvdb-memorydb" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73de822b260a3bdfb889dbbb65bb2d473eee2253973d6fa4a5d149a2a4a7c66e" -dependencies = [ - "kvdb", - "parity-util-mem", - "parking_lot 0.10.2", -] - -[[package]] -name = "kvdb-rocksdb" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44947dd392f09475af614d740fe0320b66d01cb5b977f664bbbb5e45a70ea4c1" -dependencies = [ - "fs-swap", - "kvdb", - "log", - "num_cpus", - "owning_ref", - "parity-util-mem", - "parking_lot 0.10.2", - "regex", - "rocksdb", - "smallvec 1.6.0", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" - -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi 0.3.9", -] - -[[package]] -name = "libm" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" - -[[package]] -name = "libp2p" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571f5a4604c1a40d75651da141dfde29ad15329f537a779528803297d2220274" -dependencies = [ - "atomic", - "bytes 0.5.6", - "futures 0.3.8", - "lazy_static", - "libp2p-core", - "libp2p-core-derive", - "libp2p-deflate", - "libp2p-dns", - "libp2p-floodsub", - "libp2p-gossipsub", - "libp2p-identify", - "libp2p-kad", - "libp2p-mdns", - "libp2p-mplex", - "libp2p-noise", - "libp2p-ping", - "libp2p-plaintext", - "libp2p-pnet", - "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-uds", - "libp2p-wasm-ext", - "libp2p-websocket", - "libp2p-yamux", - "multihash", - "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project 0.4.27", - "smallvec 1.6.0", - "wasm-timer", -] - -[[package]] -name = "libp2p-core" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f13ba8c7df0768af2eb391696d562c7de88cc3a35122531aaa6a7d77754d25" -dependencies = [ - "asn1_der", - "bs58 0.3.1", - "ed25519-dalek", - "either", - "fnv", - "futures 0.3.8", - "futures-timer 3.0.2", - "lazy_static", - "libsecp256k1", - "log", - "multihash", - "multistream-select", - "parity-multiaddr", - "parking_lot 0.10.2", - "pin-project 0.4.27", - "prost", - "prost-build", - "rand 0.7.3", - "ring", - "rw-stream-sink", - "sha2 0.8.2", - "smallvec 1.6.0", - "thiserror", - "unsigned-varint 0.4.0", - "void", - "zeroize", -] - -[[package]] -name = "libp2p-core-derive" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f753d9324cd3ec14bf04b8a8cd0d269c87f294153d6bf2a84497a63a5ad22213" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "libp2p-deflate" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74029ae187f35f4b8ddf26b9779a68b340045d708528a103917cdca49a296db5" -dependencies = [ - "flate2", - "futures 0.3.8", - "libp2p-core", -] - -[[package]] -name = "libp2p-dns" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cf319822e08dd65c8e060d2354e9f952895bbc433f5706c75ed010c152aee5e" -dependencies = [ - "futures 0.3.8", - "libp2p-core", - "log", -] - -[[package]] -name = "libp2p-floodsub" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a9acb43a3e4a4e413e0c4abe0fa49308df7c6335c88534757b647199cb8a51" -dependencies = [ - "cuckoofilter", - "fnv", - "futures 0.3.8", - "libp2p-core", - "libp2p-swarm", - "prost", - "prost-build", - "rand 0.7.3", - "smallvec 1.6.0", -] - -[[package]] -name = "libp2p-gossipsub" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab20fcb60edebe3173bbb708c6ac3444afdf1e3152dc2866b10c4f5497f17467" -dependencies = [ - "base64 0.11.0", - "byteorder 1.3.4", - "bytes 0.5.6", - "fnv", - "futures 0.3.8", - "futures_codec", - "hex_fmt", - "libp2p-core", - "libp2p-swarm", - "log", - "lru_time_cache", - "prost", - "prost-build", - "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.6.0", - "unsigned-varint 0.4.0", - "wasm-timer", -] - -[[package]] -name = "libp2p-identify" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56396ee63aa9164eacf40c2c5d2bda8c4133c2f57e1b0425d51d3a4e362583b1" -dependencies = [ - "futures 0.3.8", - "libp2p-core", - "libp2p-swarm", - "log", - "prost", - "prost-build", - "smallvec 1.6.0", - "wasm-timer", -] - -[[package]] -name = "libp2p-kad" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7fa9047f8b8f544278a35c2d9d45d3b2c1785f2d86d4e1629d6edf97be3955" -dependencies = [ - "arrayvec 0.5.2", - "bytes 0.5.6", - "either", - "fnv", - "futures 0.3.8", - "futures_codec", - "libp2p-core", - "libp2p-swarm", - "log", - "multihash", - "prost", - "prost-build", - "rand 0.7.3", - "sha2 0.8.2", - "smallvec 1.6.0", - "uint", - "unsigned-varint 0.4.0", - "void", - "wasm-timer", -] - -[[package]] -name = "libp2p-mdns" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3173b5a6b2f690c29ae07798d85b9441a131ac76ddae9015ef22905b623d0c69" -dependencies = [ - "async-std", - "data-encoding", - "dns-parser", - "either", - "futures 0.3.8", - "lazy_static", - "libp2p-core", - "libp2p-swarm", - "log", - "net2", - "rand 0.7.3", - "smallvec 1.6.0", - "void", - "wasm-timer", -] - -[[package]] -name = "libp2p-mplex" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a73a799cc8410b36e40b8f4c4b6babbcb9efd3727111bf517876e4acfa612d3" -dependencies = [ - "bytes 0.5.6", - "fnv", - "futures 0.3.8", - "futures_codec", - "libp2p-core", - "log", - "parking_lot 0.10.2", - "unsigned-varint 0.4.0", -] - -[[package]] -name = "libp2p-noise" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef6c490042f549fb1025f2892dfe6083d97a77558f450c1feebe748ca9eb15a" -dependencies = [ - "bytes 0.5.6", - "curve25519-dalek 2.1.0", - "futures 0.3.8", - "lazy_static", - "libp2p-core", - "log", - "prost", - "prost-build", - "rand 0.7.3", - "sha2 0.8.2", - "snow", - "static_assertions", - "x25519-dalek 0.6.0", - "zeroize", -] - -[[package]] -name = "libp2p-ping" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad063c21dfcea4518ac9e8bd4119d33a5b26c41e674f602f41f05617a368a5c8" -dependencies = [ - "futures 0.3.8", - "libp2p-core", - "libp2p-swarm", - "log", - "rand 0.7.3", - "void", - "wasm-timer", -] - -[[package]] -name = "libp2p-plaintext" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903a12e99c72dbebefea258de887982adeacc7025baa1ceb10b7fa9928f54791" -dependencies = [ - "bytes 0.5.6", - "futures 0.3.8", - "futures_codec", - "libp2p-core", - "log", - "prost", - "prost-build", - "rw-stream-sink", - "unsigned-varint 0.4.0", - "void", -] - -[[package]] -name = "libp2p-pnet" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b3c2d5d26a9500e959a0e19743897239a6c4be78dadf99b70414301a70c006" -dependencies = [ - "futures 0.3.8", - "log", - "pin-project 0.4.27", - "rand 0.7.3", - "salsa20", - "sha3", -] - -[[package]] -name = "libp2p-request-response" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0c9e8a4cd69d97e9646c54313d007512f411aba8c5226cfcda16df6a6e84a3" -dependencies = [ - "async-trait", - "bytes 0.5.6", - "futures 0.3.8", - "libp2p-core", - "libp2p-swarm", - "log", - "lru 0.6.1", - "minicbor", - "rand 0.7.3", - "smallvec 1.6.0", - "unsigned-varint 0.5.1", - "wasm-timer", -] - -[[package]] -name = "libp2p-swarm" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193e444210132237b81b755ec7fe53f1c4bd2f53cf719729b94c0c72eb6eaa1" -dependencies = [ - "either", - "futures 0.3.8", - "libp2p-core", - "log", - "rand 0.7.3", - "smallvec 1.6.0", - "void", - "wasm-timer", -] - -[[package]] -name = "libp2p-tcp" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f42ec130d7a37a7e47bf4398026b7ad9185c08ed26972e2720f8b94112796f" -dependencies = [ - "async-std", - "futures 0.3.8", - "futures-timer 3.0.2", - "get_if_addrs", - "ipnet", - "libp2p-core", - "log", - "socket2", -] - -[[package]] -name = "libp2p-uds" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea7acb0a034f70d7db94c300eba3f65c0f6298820105624088a9609c9974d77" -dependencies = [ - "async-std", - "futures 0.3.8", - "libp2p-core", - "log", -] - -[[package]] -name = "libp2p-wasm-ext" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34c1faac6f92c21fbe155417957863ea822fba9e9fd5eb24c0912336a100e63f" -dependencies = [ - "futures 0.3.8", - "js-sys", - "libp2p-core", - "parity-send-wrapper", - "wasm-bindgen", - "wasm-bindgen-futures", -] - -[[package]] -name = "libp2p-websocket" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d650534ebd99f48f6fa292ed5db10d30df2444943afde4407ceeddab8e513fca" -dependencies = [ - "async-tls", - "either", - "futures 0.3.8", - "libp2p-core", - "log", - "quicksink", - "rustls", - "rw-stream-sink", - "soketto", - "url 2.2.0", - "webpki", - "webpki-roots 0.18.0", -] - -[[package]] -name = "libp2p-yamux" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "781d9b9f043dcdabc40640807125368596b849fd4d96cdca2dcf052fdf6f33fd" -dependencies = [ - "futures 0.3.8", - "libp2p-core", - "parking_lot 0.11.1", - "thiserror", - "yamux", -] - -[[package]] -name = "librocksdb-sys" -version = "6.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b56f651c204634b936be2f92dbb42c36867e00ff7fe2405591f3b9fa66f09" -dependencies = [ - "bindgen", - "cc", - "glob", - "libc", -] - -[[package]] -name = "libsecp256k1" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc1e2c808481a63dc6da2074752fdd4336a3c8fcc68b83db6f1fd5224ae7962" -dependencies = [ - "arrayref", - "crunchy", - "digest 0.8.1", - "hmac-drbg", - "rand 0.7.3", - "sha2 0.8.2", - "subtle 2.3.0", - "typenum", -] - -[[package]] -name = "libz-sys" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113192b08db8f38796c4e85c39e960c145965140e918018bcde1952429655" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" - -[[package]] -name = "linked_hash_set" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "linregress" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9290cf6f928576eeb9c096c6fad9d8d452a0a1a70a2bbffa6e36064eedc0aac9" -dependencies = [ - "failure", - "nalgebra 0.18.1", - "statrs 0.10.0", -] - -[[package]] -name = "linregress" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0ad4b5cc8385a881c561fac3501353d63d2a2b7a357b5064d71815c9a92724" -dependencies = [ - "nalgebra 0.21.1", - "statrs 0.12.0", -] - -[[package]] -name = "lock_api" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" -dependencies = [ - "scopeguard 0.3.3", -] - -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard 1.1.0", -] - -[[package]] -name = "lock_api" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" -dependencies = [ - "scopeguard 1.1.0", -] - -[[package]] -name = "log" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" -dependencies = [ - "cfg-if 0.1.10", -] - -[[package]] -name = "loom" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0e8460f2f2121162705187214720353c517b97bdfb3494c0b1e33d83ebe4bed" -dependencies = [ - "cfg-if 0.1.10", - "generator", - "scoped-tls", - "serde", - "serde_json", -] - -[[package]] -name = "lru" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0609345ddee5badacf857d4f547e0e5a2e987db77085c24cd887f73573a04237" -dependencies = [ - "hashbrown 0.6.3", -] - -[[package]] -name = "lru" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be716eb6878ca2263eb5d00a781aa13264a794f519fe6af4fbb2668b2d5441c0" -dependencies = [ - "hashbrown 0.9.1", -] - -[[package]] -name = "lru_time_cache" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb241df5c4caeb888755363fc95f8a896618dc0d435e9e775f7930cb099beab" - -[[package]] -name = "lzw" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" - -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - -[[package]] -name = "matrixmultiply" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4f7ec66360130972f34830bfad9ef05c6610a43938a467bcc9ab9369ab3478f" -dependencies = [ - "rawpointer", -] - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - -[[package]] -name = "memchr" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "memoffset" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" -dependencies = [ - "autocfg 1.0.1", -] - -[[package]] -name = "memoffset" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" -dependencies = [ - "autocfg 1.0.1", -] - -[[package]] -name = "memory-db" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f36ddb0b2cdc25d38babba472108798e3477f02be5165f038c5e393e50c57a" -dependencies = [ - "hash-db", - "hashbrown 0.8.2", - "parity-util-mem", -] - -[[package]] -name = "memory_units" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" - -[[package]] -name = "merlin" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6feca46f4fa3443a01769d768727f10c10a20fdb65e52dc16a81f0c8269bb78" -dependencies = [ - "byteorder 1.3.4", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "minicbor" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc03ad6f8f548db7194a5ff5a6f96342ecae4e3ef67d2bf18bacc0e245cd041" -dependencies = [ - "minicbor-derive", -] - -[[package]] -name = "minicbor-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c214bf3d90099b52f3e4b328ae0fe34837fd0fab683ad1e10fceb4629106df48" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "miniz_oxide" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" -dependencies = [ - "adler", - "autocfg 1.0.1", -] - -[[package]] -name = "mio" -version = "0.6.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio", - "slab", -] - -[[package]] -name = "mio-named-pipes" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" -dependencies = [ - "log", - "mio", - "miow 0.3.6", - "winapi 0.3.9", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "miow" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" -dependencies = [ - "socket2", - "winapi 0.3.9", -] - -[[package]] -name = "multihash" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567122ab6492f49b59def14ecc36e13e64dca4188196dd0cd41f9f3f979f3df6" -dependencies = [ - "blake2b_simd", - "blake2s_simd", - "digest 0.9.0", - "sha-1 0.9.2", - "sha2 0.9.2", - "sha3", - "unsigned-varint 0.5.1", -] - -[[package]] -name = "multimap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333" - -[[package]] -name = "multistream-select" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93faf2e41f9ee62fb01680ed48f3cc26652352327aa2e59869070358f6b7dd75" -dependencies = [ - "bytes 0.5.6", - "futures 0.3.8", - "log", - "pin-project 1.0.2", - "smallvec 1.6.0", - "unsigned-varint 0.5.1", -] - -[[package]] -name = "nalgebra" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" -dependencies = [ - "alga", - "approx", - "generic-array 0.12.3", - "matrixmultiply", - "num-complex", - "num-rational 0.2.4", - "num-traits", - "rand 0.6.5", - "typenum", -] - -[[package]] -name = "nalgebra" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6147c3d50b4f3cdabfe2ecc94a0191fd3d6ad58aefd9664cf396285883486" -dependencies = [ - "approx", - "generic-array 0.13.3", - "matrixmultiply", - "num-complex", - "num-rational 0.2.4", - "num-traits", - "rand 0.7.3", - "rand_distr", - "simba", - "typenum", -] - -[[package]] -name = "names" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -dependencies = [ - "rand 0.3.23", -] - -[[package]] -name = "nb-connect" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "net2" -version = "0.2.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cf75f38f16cb05ea017784dc6dbfd354f76c223dba37701734c4f5a9337d02" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "node-bench" -version = "0.8.0" -dependencies = [ - "derive_more", - "fs_extra", - "futures 0.3.8", - "hash-db", - "hex", - "kvdb", - "kvdb-rocksdb", - "lazy_static", - "linregress 0.4.0", - "log", - "node-primitives", - "node-runtime", - "parity-db", - "parity-util-mem", - "plotters", - "rand 0.7.3", - "sc-basic-authorship", - "sc-cli", - "sc-client-api", - "sc-transaction-pool", - "serde", - "serde_json", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-tracing", - "sp-transaction-pool", - "sp-trie", - "structopt", - "tempfile", -] - -[[package]] -name = "node-primitives" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-system", - "parity-scale-codec", - "sp-application-crypto", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "node-runtime" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "integer-sqrt", - "node-primitives", - "pallet-authority-discovery", - "pallet-authorship", - "pallet-babe", - "pallet-balances", - "pallet-collective", - "pallet-contracts", - "pallet-contracts-primitives", - "pallet-contracts-rpc-runtime-api", - "pallet-democracy", - "pallet-elections-phragmen", - "pallet-finality-tracker", - "pallet-grandpa", - "pallet-identity", - "pallet-im-online", - "pallet-indices", - "pallet-membership", - "pallet-multisig", - "pallet-offences", - "pallet-proxy", - "pallet-randomness-collective-flip", - "pallet-recovery", - "pallet-scheduler", - "pallet-session", - "pallet-society", - "pallet-staking", - "pallet-staking-reward-curve", - "pallet-sudo", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "pallet-treasury", - "pallet-utility", - "pallet-vesting", - "parity-scale-codec", - "serde", - "sp-api", - "sp-authority-discovery", - "sp-block-builder", - "sp-consensus-babe", - "sp-core", - "sp-inherents", - "sp-keyring", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-transaction-pool", - "sp-version", - "static_assertions", - "substrate-wasm-builder-runner", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "memchr", - "version_check", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg 1.0.1", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg 1.0.1", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg 1.0.1", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg 1.0.1", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg 1.0.1", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg 1.0.1", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg 1.0.1", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" - -[[package]] -name = "once_cell" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" -dependencies = [ - "parking_lot 0.7.1", -] - -[[package]] -name = "once_cell" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" -dependencies = [ - "parking_lot 0.11.1", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl-probe" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" - -[[package]] -name = "ordered-float" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" -dependencies = [ - "num-traits", -] - -[[package]] -name = "owning_ref" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "pallet-authority-discovery" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-session", - "parity-scale-codec", - "serde", - "sp-application-crypto", - "sp-authority-discovery", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-authorship" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-authorship", - "sp-inherents", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-babe" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-session", - "pallet-timestamp", - "parity-scale-codec", - "serde", - "sp-application-crypto", - "sp-consensus-babe", - "sp-consensus-vrf", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "pallet-balances" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-collective" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-contracts" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "bitflags", - "frame-support", - "frame-system", - "pallet-contracts-primitives", - "parity-scale-codec", - "parity-wasm", - "pwasm-utils", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-sandbox", - "sp-std", - "wasmi-validation", -] - -[[package]] -name = "pallet-contracts-primitives" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "pallet-contracts-primitives", - "parity-scale-codec", - "sp-api", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-democracy" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-elections-phragmen" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-npos-elections", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-finality-tracker" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "serde", - "sp-finality-tracker", - "sp-inherents", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-grandpa" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-finality-tracker", - "pallet-session", - "parity-scale-codec", - "serde", - "sp-application-crypto", - "sp-core", - "sp-finality-grandpa", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-identity" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "enumflags2", - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-im-online" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "serde", - "sp-application-crypto", - "sp-core", - "sp-io", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-indices" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-membership" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-multisig" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-offences" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-balances", - "parity-scale-codec", - "serde", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "pallet-proxy" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-randomness-collective-flip" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "safe-mix", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-recovery" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "enumflags2", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-scheduler" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-session" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "pallet-timestamp", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-session", - "sp-staking", - "sp-std", - "sp-trie", -] - -[[package]] -name = "pallet-society" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "rand_chacha 0.2.2", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-staking" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-authorship", - "pallet-session", - "parity-scale-codec", - "serde", - "sp-application-crypto", - "sp-io", - "sp-npos-elections", - "sp-runtime", - "sp-staking", - "sp-std", - "static_assertions", -] - -[[package]] -name = "pallet-staking-reward-curve" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pallet-sudo" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-timestamp" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "parity-scale-codec", - "serde", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "pallet-transaction-payment" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "serde", - "smallvec 1.6.0", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "parity-scale-codec", - "serde", - "sp-api", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-treasury" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "pallet-balances", - "parity-scale-codec", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-utility" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "pallet-vesting" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "enumflags2", - "frame-support", - "frame-system", - "parity-scale-codec", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "parity-db" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d595e372d119261593297debbe4193811a4dc811d2a1ccbb8caaa6666ad7ab" -dependencies = [ - "blake2-rfc", - "crc32fast", - "libc", - "log", - "memmap", - "parking_lot 0.10.2", -] - -[[package]] -name = "parity-multiaddr" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43244a26dc1ddd3097216bb12eaa6cf8a07b060c72718d9ebd60fd297d6401df" -dependencies = [ - "arrayref", - "bs58 0.4.0", - "byteorder 1.3.4", - "data-encoding", - "multihash", - "percent-encoding 2.1.0", - "serde", - "static_assertions", - "unsigned-varint 0.5.1", - "url 2.2.0", -] - -[[package]] -name = "parity-scale-codec" -version = "1.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c740e5fbcb6847058b40ac7e5574766c6388f585e184d769910fe0d3a2ca861" -dependencies = [ - "arrayvec 0.5.2", - "bitvec", - "byte-slice-cast", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db82bb1c18fc00176004462dd809b2a6d851669550aa17af6dacd21ae0c14" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" - -[[package]] -name = "parity-tokio-ipc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e57fea504fea33f9fbb5f49f378359030e7e026a6ab849bb9e8f0787376f1bf" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "libc", - "log", - "mio-named-pipes", - "miow 0.3.6", - "rand 0.7.3", - "tokio 0.1.22", - "tokio-named-pipes", - "tokio-uds", - "winapi 0.3.9", -] - -[[package]] -name = "parity-util-mem" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297ff91fa36aec49ce183484b102f6b75b46776822bd81525bfc4cc9b0dd0f5c" -dependencies = [ - "cfg-if 0.1.10", - "hashbrown 0.8.2", - "impl-trait-for-tuples", - "parity-util-mem-derive", - "parking_lot 0.10.2", - "primitive-types", - "smallvec 1.6.0", - "winapi 0.3.9", -] - -[[package]] -name = "parity-util-mem-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" -dependencies = [ - "proc-macro2", - "syn", - "synstructure", -] - -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - -[[package]] -name = "parity-ws" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e02a625dd75084c2a7024f07c575b61b782f729d18702dabb3cdbf31911dc61" -dependencies = [ - "byteorder 1.3.4", - "bytes 0.4.12", - "httparse", - "log", - "mio", - "mio-extras", - "rand 0.7.3", - "sha-1 0.8.2", - "slab", - "url 2.2.0", -] - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -dependencies = [ - "lock_api 0.1.5", - "parking_lot_core 0.4.0", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.6.2", - "rustc_version", -] - -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", -] - -[[package]] -name = "parking_lot" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" -dependencies = [ - "instant", - "lock_api 0.4.2", - "parking_lot_core 0.8.0", -] - -[[package]] -name = "parking_lot_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -dependencies = [ - "libc", - "rand 0.6.5", - "rustc_version", - "smallvec 0.6.13", - "winapi 0.3.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi 0.0.3", - "libc", - "redox_syscall", - "rustc_version", - "smallvec 0.6.13", - "winapi 0.3.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi 0.0.3", - "libc", - "redox_syscall", - "smallvec 1.6.0", - "winapi 0.3.9", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi 0.1.0", - "instant", - "libc", - "redox_syscall", - "smallvec 1.6.0", - "winapi 0.3.9", -] - -[[package]] -name = "paste" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" -dependencies = [ - "paste-impl", - "proc-macro-hack", -] - -[[package]] -name = "paste-impl" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" -dependencies = [ - "proc-macro-hack", -] - -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b451513912d6b3440e443aa75a73ab22203afedc4a90df8526d008c0f86f7cb3" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "pbkdf2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" -dependencies = [ - "byteorder 1.3.4", - "crypto-mac 0.7.0", - "rayon", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "petgraph" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pin-project" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" -dependencies = [ - "pin-project-internal 0.4.27", -] - -[[package]] -name = "pin-project" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7" -dependencies = [ - "pin-project-internal 1.0.2", -] - -[[package]] -name = "pin-project-internal" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" - -[[package]] -name = "pin-project-lite" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "plotters" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a" -dependencies = [ - "chrono", - "font-kit", - "image 0.23.14", - "lazy_static", - "num-traits", - "plotters-backend", - "plotters-bitmap", - "plotters-svg", - "rusttype", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07fffcddc1cb3a1de753caa4e4df03b79922ba43cf882acc1bdd7e8df9f4590" - -[[package]] -name = "plotters-bitmap" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b0bdaf5194ad865c6225f5e82f5fdde700ce999d227471809551d6e0b1c557" -dependencies = [ - "gif", - "image 0.22.5", - "plotters-backend", -] - -[[package]] -name = "plotters-svg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b38a02e23bd9604b842a812063aec4ef702b57989c37b655254bb61c471ad211" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "png" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef859a23054bbfee7811284275ae522f0434a3c8e7f4b74bd4a35ae7e1c4a283" -dependencies = [ - "bitflags", - "crc32fast", - "deflate 0.7.20", - "inflate", -] - -[[package]] -name = "png" -version = "0.16.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" -dependencies = [ - "bitflags", - "crc32fast", - "deflate 0.8.6", - "miniz_oxide 0.3.7", -] - -[[package]] -name = "polling" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "log", - "wepoll-sys", - "winapi 0.3.9", -] - -[[package]] -name = "poly1305" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce46de8e53ee414ca4d02bfefac75d8c12fba948b76622a40b4be34dfce980" -dependencies = [ - "universal-hash", -] - -[[package]] -name = "polyval" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3fd900a291ceb8b99799cc8cd3d1d3403a51721e015bc533528b2ceafcc443c" -dependencies = [ - "cfg-if 1.0.0", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - -[[package]] -name = "primitive-types" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd39dcacf71411ba488570da7bbc89b717225e46478b30ba99b92db6b149809" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-serde", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" - -[[package]] -name = "proc-macro2" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "prometheus" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d70cf4412832bcac9cffe27906f4a66e450d323525e977168c70d1b36120ae" -dependencies = [ - "cfg-if 0.1.10", - "fnv", - "lazy_static", - "parking_lot 0.11.1", - "regex", - "thiserror", -] - -[[package]] -name = "prost" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce49aefe0a6144a45de32927c77bd2859a5f7677b55f220ae5b744e87389c212" -dependencies = [ - "bytes 0.5.6", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" -dependencies = [ - "bytes 0.5.6", - "heck", - "itertools", - "log", - "multimap", - "petgraph", - "prost", - "prost-types", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "prost-types" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1834f67c0697c001304b75be76f67add9c89742eda3a085ad8ee0bb38c3417aa" -dependencies = [ - "bytes 0.5.6", - "prost", -] - -[[package]] -name = "pwasm-utils" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f53bc2558e8376358ebdc28301546471d67336584f6438ed4b7c7457a055fd7" -dependencies = [ - "byteorder 1.3.4", - "log", - "parity-wasm", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quicksink" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77de3c815e5a160b1539c6592796801df2043ae35e123b46d73380cfa57af858" -dependencies = [ - "futures-core", - "futures-sink", - "pin-project-lite 0.1.11", -] - -[[package]] -name = "quote" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - -[[package]] -name = "rand" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" -dependencies = [ - "libc", - "rand 0.4.6", -] - -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -dependencies = [ - "cloudabi 0.0.3", - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "winapi 0.3.9", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.7", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg 0.1.2", - "rand_xorshift", - "winapi 0.3.9", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.15", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", - "rand_pcg 0.2.1", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.15", -] - -[[package]] -name = "rand_distr" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96977acbdd3a6576fb1d27391900035bf3863d4a16422973a409b488cf29ffb2" -dependencies = [ - "rand 0.7.3", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi 0.0.3", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.7", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" -dependencies = [ - "autocfg 1.0.1", - "crossbeam-deque 0.8.0", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque 0.8.0", - "crossbeam-utils 0.8.1", - "lazy_static", - "num_cpus", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_users" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" -dependencies = [ - "getrandom 0.1.15", - "redox_syscall", - "rust-argon2", -] - -[[package]] -name = "ref-cast" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17626b2f4bcf35b84bf379072a66e28cfe5c3c6ae58b38e4914bb8891dabece" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c523ccaed8ac4b0288948849a350b37d3035827413c458b6a40ddb614bb4f72" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "regex" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", - "thread_local", -] - -[[package]] -name = "regex-automata" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -dependencies = [ - "byteorder 1.3.4", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "retain_mut" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e005d658ad26eacc2b6c506dfde519f4e277e328d0eb3379ca61647d70a8f531" - -[[package]] -name = "ring" -version = "0.16.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70017ed5c555d79ee3538fc63ca09c70ad8f317dcadc1adc2c496b60c22bb24f" -dependencies = [ - "cc", - "libc", - "once_cell 1.5.2", - "spin", - "untrusted", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "rocksdb" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d83c02c429044d58474eaf5ae31e062d0de894e21125b47437ec0edc1397e6" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[package]] -name = "rpassword" -version = "4.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99371657d3c8e4d816fb6221db98fa408242b0b53bac08f8676a41f8554fe99f" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64 0.13.0", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils 0.8.1", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "rustls" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" -dependencies = [ - "base64 0.12.3", - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls-native-certs" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629d439a7672da82dd955498445e496ee2096fe2117b9f796558a43fdb9e59b8" -dependencies = [ - "openssl-probe", - "rustls", - "schannel", - "security-framework", -] - -[[package]] -name = "rusttype" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0" -dependencies = [ - "approx", - "ordered-float", - "stb_truetype", -] - -[[package]] -name = "rw-stream-sink" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" -dependencies = [ - "futures 0.3.8", - "pin-project 0.4.27", - "static_assertions", -] - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safe-mix" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3d055a2582e6b00ed7a31c1524040aa391092bf636328350813f3a0605215c" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "salsa20" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f47b10fa80f6969bbbd9c8e7cc998f082979d402a9e10579e2303a87955395" -dependencies = [ - "stream-cipher", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "sc-basic-authorship" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "futures-timer 3.0.2", - "log", - "parity-scale-codec", - "sc-block-builder", - "sc-client-api", - "sc-proposer-metrics", - "sc-telemetry", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-transaction-pool", - "substrate-prometheus-endpoint", - "tokio-executor 0.2.0-alpha.6", -] - -[[package]] -name = "sc-block-builder" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sc-client-api", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-chain-spec" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "sc-chain-spec-derive", - "sc-network", - "sc-telemetry", - "serde", - "serde_json", - "sp-chain-spec", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sc-chain-spec-derive" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sc-cli" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "ansi_term 0.12.1", - "atty", - "bip39", - "chrono", - "derive_more", - "fdlimit", - "futures 0.3.8", - "hex", - "lazy_static", - "libp2p", - "log", - "names", - "nix", - "parity-scale-codec", - "parity-util-mem", - "rand 0.7.3", - "regex", - "rpassword", - "sc-client-api", - "sc-informant", - "sc-keystore", - "sc-network", - "sc-service", - "sc-telemetry", - "sc-tracing", - "serde", - "serde_json", - "sp-blockchain", - "sp-core", - "sp-keyring", - "sp-panic-handler", - "sp-runtime", - "sp-state-machine", - "sp-utils", - "sp-version", - "structopt", - "substrate-prometheus-endpoint", - "time", - "tokio 0.2.23", - "tracing", - "tracing-log", - "tracing-subscriber", -] - -[[package]] -name = "sc-client-api" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "fnv", - "futures 0.3.8", - "hash-db", - "hex-literal", - "kvdb", - "lazy_static", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "sc-executor", - "sc-telemetry", - "sp-api", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-externalities", - "sp-inherents", - "sp-keyring", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-storage", - "sp-transaction-pool", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-client-db" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "blake2-rfc", - "hash-db", - "kvdb", - "kvdb-memorydb", - "linked-hash-map", - "log", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", - "sc-client-api", - "sc-executor", - "sc-state-db", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-database", - "sp-runtime", - "sp-state-machine", - "sp-trie", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-executor" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "lazy_static", - "libsecp256k1", - "log", - "parity-scale-codec", - "parity-wasm", - "parking_lot 0.10.2", - "sc-executor-common", - "sc-executor-wasmi", - "sp-api", - "sp-core", - "sp-externalities", - "sp-io", - "sp-panic-handler", - "sp-runtime-interface", - "sp-serializer", - "sp-trie", - "sp-version", - "sp-wasm-interface", - "wasmi", -] - -[[package]] -name = "sc-executor-common" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "log", - "parity-scale-codec", - "parity-wasm", - "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-serializer", - "sp-wasm-interface", - "wasmi", -] - -[[package]] -name = "sc-executor-wasmi" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "log", - "parity-scale-codec", - "sc-executor-common", - "sp-allocator", - "sp-core", - "sp-runtime-interface", - "sp-wasm-interface", - "wasmi", -] - -[[package]] -name = "sc-informant" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "ansi_term 0.12.1", - "futures 0.3.8", - "log", - "parity-util-mem", - "sc-client-api", - "sc-network", - "sp-blockchain", - "sp-runtime", - "sp-transaction-pool", - "sp-utils", - "wasm-timer", -] - -[[package]] -name = "sc-keystore" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "hex", - "merlin", - "parking_lot 0.10.2", - "rand 0.7.3", - "serde_json", - "sp-application-crypto", - "sp-core", - "subtle 2.3.0", -] - -[[package]] -name = "sc-light" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "hash-db", - "lazy_static", - "parity-scale-codec", - "parking_lot 0.10.2", - "sc-client-api", - "sc-executor", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-externalities", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sc-network" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "async-std", - "async-trait", - "bitflags", - "bs58 0.3.1", - "bytes 0.5.6", - "derive_more", - "either", - "erased-serde", - "fnv", - "fork-tree", - "futures 0.3.8", - "futures-timer 3.0.2", - "futures_codec", - "hex", - "ip_network", - "libp2p", - "linked-hash-map", - "linked_hash_set", - "log", - "lru 0.4.3", - "nohash-hasher", - "parity-scale-codec", - "parking_lot 0.10.2", - "pin-project 0.4.27", - "prost", - "prost-build", - "rand 0.7.3", - "sc-block-builder", - "sc-client-api", - "sc-peerset", - "serde", - "serde_json", - "slog", - "slog_derive", - "smallvec 0.6.13", - "sp-arithmetic", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-runtime", - "sp-utils", - "substrate-prometheus-endpoint", - "thiserror", - "unsigned-varint 0.4.0", - "void", - "wasm-timer", - "zeroize", -] - -[[package]] -name = "sc-offchain" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "bytes 0.5.6", - "fnv", - "futures 0.3.8", - "futures-timer 3.0.2", - "hyper 0.13.9", - "hyper-rustls", - "log", - "num_cpus", - "parity-scale-codec", - "parking_lot 0.10.2", - "rand 0.7.3", - "sc-client-api", - "sc-keystore", - "sc-network", - "sp-api", - "sp-core", - "sp-offchain", - "sp-runtime", - "sp-utils", - "threadpool", -] - -[[package]] -name = "sc-peerset" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "libp2p", - "log", - "serde_json", - "sp-utils", - "wasm-timer", -] - -[[package]] -name = "sc-proposer-metrics" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "log", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-rpc" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "sc-block-builder", - "sc-client-api", - "sc-executor", - "sc-keystore", - "sc-rpc-api", - "serde_json", - "sp-api", - "sp-blockchain", - "sp-chain-spec", - "sp-core", - "sp-offchain", - "sp-rpc", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-transaction-pool", - "sp-utils", - "sp-version", -] - -[[package]] -name = "sc-rpc-api" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "futures 0.3.8", - "jsonrpc-core", - "jsonrpc-core-client", - "jsonrpc-derive", - "jsonrpc-pubsub", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "serde", - "serde_json", - "sp-chain-spec", - "sp-core", - "sp-rpc", - "sp-runtime", - "sp-transaction-pool", - "sp-version", -] - -[[package]] -name = "sc-rpc-server" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.1.30", - "jsonrpc-core", - "jsonrpc-http-server", - "jsonrpc-ipc-server", - "jsonrpc-pubsub", - "jsonrpc-ws-server", - "log", - "serde", - "serde_json", - "sp-runtime", - "substrate-prometheus-endpoint", -] - -[[package]] -name = "sc-service" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "directories", - "exit-future", - "futures 0.1.30", - "futures 0.3.8", - "futures-timer 3.0.2", - "hash-db", - "jsonrpc-core", - "jsonrpc-pubsub", - "lazy_static", - "log", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", - "pin-project 0.4.27", - "rand 0.7.3", - "sc-block-builder", - "sc-chain-spec", - "sc-client-api", - "sc-client-db", - "sc-executor", - "sc-informant", - "sc-keystore", - "sc-light", - "sc-network", - "sc-offchain", - "sc-rpc", - "sc-rpc-server", - "sc-telemetry", - "sc-tracing", - "sc-transaction-pool", - "serde", - "serde_json", - "slog", - "sp-api", - "sp-application-crypto", - "sp-block-builder", - "sp-blockchain", - "sp-consensus", - "sp-core", - "sp-externalities", - "sp-inherents", - "sp-io", - "sp-runtime", - "sp-session", - "sp-state-machine", - "sp-tracing", - "sp-transaction-pool", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", - "tempfile", - "tracing", - "wasm-timer", -] - -[[package]] -name = "sc-state-db" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "log", - "parity-scale-codec", - "parity-util-mem", - "parity-util-mem-derive", - "parking_lot 0.10.2", - "sc-client-api", - "sp-core", -] - -[[package]] -name = "sc-telemetry" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "futures-timer 3.0.2", - "libp2p", - "log", - "parking_lot 0.10.2", - "pin-project 0.4.27", - "rand 0.7.3", - "serde", - "slog", - "slog-json", - "slog-scope", - "take_mut", - "void", - "wasm-timer", -] - -[[package]] -name = "sc-tracing" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "erased-serde", - "log", - "parking_lot 0.10.2", - "rustc-hash", - "sc-telemetry", - "serde", - "serde_json", - "slog", - "sp-tracing", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "sc-transaction-graph" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "futures 0.3.8", - "linked-hash-map", - "log", - "parity-util-mem", - "parking_lot 0.10.2", - "retain_mut", - "serde", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-transaction-pool", - "sp-utils", - "wasm-timer", -] - -[[package]] -name = "sc-transaction-pool" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "futures 0.3.8", - "futures-diagnose", - "intervalier", - "log", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", - "sc-client-api", - "sc-transaction-graph", - "sp-api", - "sp-blockchain", - "sp-core", - "sp-runtime", - "sp-tracing", - "sp-transaction-pool", - "sp-utils", - "substrate-prometheus-endpoint", - "wasm-timer", -] - -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi 0.3.9", -] - -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.0", - "getrandom 0.1.15", - "merlin", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle 2.3.0", - "zeroize", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scopeguard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "sct" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9182278ed645df3477a9c27bfee0621c621aa16f6972635f7f795dae3d81070f" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad502866817f0575705bd7be36e2b2535cc33262d493aa733a2ec862baa2bc2b" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ceb04988b17b6d1dcd555390fa822ca5637b4a14e1f5099f13d351bed4d6c7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "servo-fontconfig" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a088f8d775a5c5314aae09bd77340bc9c67d72b9a45258be34c83548b4814cd9" -dependencies = [ - "libc", - "servo-fontconfig-sys", -] - -[[package]] -name = "servo-fontconfig-sys" -version = "4.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b3e166450f523f4db06c14f02a2d39e76d49b5d8cbd224338d93e3595c156c" -dependencies = [ - "expat-sys", - "pkg-config", - "servo-freetype-sys", -] - -[[package]] -name = "servo-freetype-sys" -version = "4.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ccb6d0d32d277d3ef7dea86203d8210945eb7a45fba89dd445b3595dd0dfc" -dependencies = [ - "cmake", - "pkg-config", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha-1" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce3cdf1b5e620a498ee6f2a171885ac7e22f0e12089ec4b3d22b84921792507c" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpuid-bool", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpuid-bool", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug 0.3.0", -] - -[[package]] -name = "sharded-slab" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4921be914e16899a80adefb821f8ddb7974e3f1250223575a44ed994882127" -dependencies = [ - "lazy_static", - "loom", -] - -[[package]] -name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - -[[package]] -name = "signal-hook-registry" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce32ea0c6c56d5eacaeb814fbed9960547021d3edd010ded1425f180536b20ab" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29f060a7d147e33490ec10da418795238fd7545bba241504d6b31a409f2e6210" - -[[package]] -name = "simba" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb931b1367faadea6b1ab1c306a860ec17aaa5fa39f367d0c744e69d971a1fb2" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", -] - -[[package]] -name = "slab" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" - -[[package]] -name = "slog" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8347046d4ebd943127157b94d63abb990fcf729dc4e9978927fdf4ac3c998d06" -dependencies = [ - "erased-serde", -] - -[[package]] -name = "slog-json" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" -dependencies = [ - "chrono", - "erased-serde", - "serde", - "serde_json", - "slog", -] - -[[package]] -name = "slog-scope" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c44c89dd8b0ae4537d1ae318353eaf7840b4869c536e31c41e963d1ea523ee6" -dependencies = [ - "arc-swap", - "lazy_static", - "slog", -] - -[[package]] -name = "slog_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "smallvec" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -dependencies = [ - "maybe-uninit", -] - -[[package]] -name = "smallvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a55ca5f3b68e41c979bf8c46a6f1da892ca4db8f94023ce0bd32407573b1ac0" - -[[package]] -name = "snow" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795dd7aeeee24468e5a32661f6d27f7b5cbed802031b2d7640c7b10f8fb2dd50" -dependencies = [ - "aes-gcm", - "blake2", - "chacha20poly1305", - "rand 0.7.3", - "rand_core 0.5.1", - "ring", - "rustc_version", - "sha2 0.9.2", - "subtle 2.3.0", - "x25519-dalek 1.1.0", -] - -[[package]] -name = "socket2" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c29947abdee2a218277abeca306f25789c938e500ea5a9d4b12a5a504466902" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "winapi 0.3.9", -] - -[[package]] -name = "soketto" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c71ed3d54db0a699f4948e1bb3e45b450fa31fe602621dee6680361d569c88" -dependencies = [ - "base64 0.12.3", - "bytes 0.5.6", - "flate2", - "futures 0.3.8", - "httparse", - "log", - "rand 0.7.3", - "sha-1 0.9.2", -] - -[[package]] -name = "sp-allocator" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "log", - "sp-core", - "sp-std", - "sp-wasm-interface", -] - -[[package]] -name = "sp-api" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "hash-db", - "parity-scale-codec", - "sp-api-proc-macro", - "sp-core", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-version", -] - -[[package]] -name = "sp-api-proc-macro" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "blake2-rfc", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-application-crypto" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-core", - "sp-io", - "sp-std", -] - -[[package]] -name = "sp-arithmetic" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "serde", - "sp-debug-derive", - "sp-std", -] - -[[package]] -name = "sp-authority-discovery" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-authorship" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-inherents", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-block-builder" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-blockchain" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "log", - "lru 0.4.3", - "parity-scale-codec", - "parking_lot 0.10.2", - "sp-block-builder", - "sp-consensus", - "sp-database", - "sp-runtime", - "sp-state-machine", -] - -[[package]] -name = "sp-chain-spec" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "sp-consensus" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "futures 0.3.8", - "futures-timer 3.0.2", - "libp2p", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "serde", - "sp-api", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-state-machine", - "sp-std", - "sp-trie", - "sp-utils", - "sp-version", - "substrate-prometheus-endpoint", - "wasm-timer", -] - -[[package]] -name = "sp-consensus-babe" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "merlin", - "parity-scale-codec", - "sp-api", - "sp-application-crypto", - "sp-consensus", - "sp-consensus-slots", - "sp-consensus-vrf", - "sp-core", - "sp-inherents", - "sp-runtime", - "sp-std", - "sp-timestamp", -] - -[[package]] -name = "sp-consensus-slots" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-runtime", -] - -[[package]] -name = "sp-consensus-vrf" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "schnorrkel", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-core" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "base58", - "blake2-rfc", - "byteorder 1.3.4", - "derive_more", - "dyn-clonable", - "ed25519-dalek", - "futures 0.3.8", - "hash-db", - "hash256-std-hasher", - "hex", - "impl-serde", - "lazy_static", - "libsecp256k1", - "log", - "merlin", - "num-traits", - "parity-scale-codec", - "parity-util-mem", - "parking_lot 0.10.2", - "primitive-types", - "rand 0.7.3", - "regex", - "schnorrkel", - "secrecy", - "serde", - "sha2 0.8.2", - "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", - "sp-std", - "sp-storage", - "substrate-bip39", - "tiny-bip39", - "tiny-keccak", - "twox-hash", - "wasmi", - "zeroize", -] - -[[package]] -name = "sp-database" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "kvdb", - "parking_lot 0.10.2", -] - -[[package]] -name = "sp-debug-derive" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-externalities" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "environmental", - "parity-scale-codec", - "sp-std", - "sp-storage", -] - -[[package]] -name = "sp-finality-grandpa" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "finality-grandpa", - "log", - "parity-scale-codec", - "serde", - "sp-api", - "sp-application-crypto", - "sp-core", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-finality-tracker" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-inherents", - "sp-std", -] - -[[package]] -name = "sp-inherents" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "parity-scale-codec", - "parking_lot 0.10.2", - "sp-core", - "sp-std", -] - -[[package]] -name = "sp-io" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "hash-db", - "libsecp256k1", - "log", - "parity-scale-codec", - "parking_lot 0.10.2", - "sp-core", - "sp-externalities", - "sp-runtime-interface", - "sp-state-machine", - "sp-std", - "sp-tracing", - "sp-trie", - "sp-wasm-interface", - "tracing", - "tracing-core", -] - -[[package]] -name = "sp-keyring" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "lazy_static", - "sp-core", - "sp-runtime", - "strum", -] - -[[package]] -name = "sp-npos-elections" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "serde", - "sp-arithmetic", - "sp-npos-elections-compact", - "sp-std", -] - -[[package]] -name = "sp-npos-elections-compact" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-offchain" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "sp-api", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "sp-panic-handler" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "backtrace", - "log", -] - -[[package]] -name = "sp-rpc" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "serde", - "sp-core", -] - -[[package]] -name = "sp-runtime" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "either", - "hash256-std-hasher", - "impl-trait-for-tuples", - "log", - "parity-scale-codec", - "parity-util-mem", - "paste", - "rand 0.7.3", - "serde", - "sp-application-crypto", - "sp-arithmetic", - "sp-core", - "sp-inherents", - "sp-io", - "sp-std", -] - -[[package]] -name = "sp-runtime-interface" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", - "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", - "static_assertions", -] - -[[package]] -name = "sp-runtime-interface-proc-macro" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "Inflector", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-sandbox" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-core", - "sp-io", - "sp-std", - "sp-wasm-interface", - "wasmi", -] - -[[package]] -name = "sp-serializer" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "sp-session" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-api", - "sp-core", - "sp-runtime", - "sp-staking", - "sp-std", -] - -[[package]] -name = "sp-staking" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "parity-scale-codec", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-state-machine" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "hash-db", - "log", - "num-traits", - "parity-scale-codec", - "parking_lot 0.10.2", - "rand 0.7.3", - "smallvec 1.6.0", - "sp-core", - "sp-externalities", - "sp-panic-handler", - "sp-std", - "sp-trie", - "trie-db", - "trie-root", -] - -[[package]] -name = "sp-std" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" - -[[package]] -name = "sp-storage" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "ref-cast", - "serde", - "sp-debug-derive", - "sp-std", -] - -[[package]] -name = "sp-timestamp" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-api", - "sp-inherents", - "sp-runtime", - "sp-std", - "wasm-timer", -] - -[[package]] -name = "sp-tracing" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "log", - "parity-scale-codec", - "sp-std", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "sp-transaction-pool" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "derive_more", - "futures 0.3.8", - "log", - "parity-scale-codec", - "serde", - "sp-api", - "sp-blockchain", - "sp-runtime", -] - -[[package]] -name = "sp-trie" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "hash-db", - "memory-db", - "parity-scale-codec", - "sp-core", - "sp-std", - "trie-db", - "trie-root", -] - -[[package]] -name = "sp-utils" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "futures 0.3.8", - "futures-core", - "futures-timer 3.0.2", - "lazy_static", - "prometheus", -] - -[[package]] -name = "sp-version" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "impl-serde", - "parity-scale-codec", - "serde", - "sp-runtime", - "sp-std", -] - -[[package]] -name = "sp-wasm-interface" -version = "2.0.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "impl-trait-for-tuples", - "parity-scale-codec", - "sp-std", - "wasmi", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "statrs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10102ac8d55e35db2b3fafc26f81ba8647da2e15879ab686a67e6d19af2685e8" -dependencies = [ - "rand 0.5.6", -] - -[[package]] -name = "statrs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce16f6de653e88beca7bd13780d08e09d4489dbca1f9210e041bc4852481382" -dependencies = [ - "rand 0.7.3", -] - -[[package]] -name = "stb_truetype" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51" -dependencies = [ - "byteorder 1.3.4", -] - -[[package]] -name = "stream-cipher" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80e15f898d8d8f25db24c253ea615cc14acf418ff307822995814e7d42cfa89" -dependencies = [ - "block-cipher", - "generic-array 0.14.4", -] - -[[package]] -name = "string" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -dependencies = [ - "bytes 0.4.12", -] - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "strum" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "substrate-bip39" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed6646a0159b9935b5d045611560eeef842b78d7adc3ba36f5ca325a13a0236" -dependencies = [ - "hmac", - "pbkdf2", - "schnorrkel", - "sha2 0.8.2", - "zeroize", -] - -[[package]] -name = "substrate-prometheus-endpoint" -version = "0.8.0" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" -dependencies = [ - "async-std", - "derive_more", - "futures-util", - "hyper 0.13.9", - "log", - "prometheus", - "tokio 0.2.23", -] - -[[package]] -name = "substrate-wasm-builder-runner" -version = "1.0.6" -source = "git+https://github.com/paritytech/substrate.git?rev=a200cdb93c6af5763b9c7bf313fa708764ac88ca#a200cdb93c6af5763b9c7bf313fa708764ac88ca" - -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" - -[[package]] -name = "subtle" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" - -[[package]] -name = "syn" -version = "1.0.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "synstructure" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" - -[[package]] -name = "tempfile" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "rand 0.7.3", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", -] - -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - -[[package]] -name = "tiny-bip39" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0165e045cc2ae1660270ca65e1676dbaab60feb0f91b10f7d0665e9b47e31f2" -dependencies = [ - "failure", - "hmac", - "once_cell 1.5.2", - "pbkdf2", - "rand 0.7.3", - "rustc-hash", - "sha2 0.8.2", - "unicode-normalization", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "mio", - "num_cpus", - "tokio-codec", - "tokio-current-thread", - "tokio-executor 0.1.10", - "tokio-fs", - "tokio-io", - "tokio-reactor", - "tokio-sync 0.1.8", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "tokio-udp", - "tokio-uds", -] - -[[package]] -name = "tokio" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d7ad61edd59bfcc7e80dababf0f4aed2e6d5e0ba1659356ae889752dfc12ff" -dependencies = [ - "bytes 0.5.6", - "fnv", - "futures-core", - "iovec", - "lazy_static", - "libc", - "memchr", - "mio", - "mio-uds", - "num_cpus", - "pin-project-lite 0.1.11", - "signal-hook-registry", - "slab", - "winapi 0.3.9", -] - -[[package]] -name = "tokio-buf" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" -dependencies = [ - "bytes 0.4.12", - "either", - "futures 0.1.30", -] - -[[package]] -name = "tokio-codec" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "tokio-io", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" -dependencies = [ - "futures 0.1.30", - "tokio-executor 0.1.10", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.30", -] - -[[package]] -name = "tokio-executor" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee9ceecf69145923834ea73f32ba40c790fd877b74a7817dd0b089f1eb9c7c8" -dependencies = [ - "futures-util-preview", - "lazy_static", - "tokio-sync 0.2.0-alpha.6", -] - -[[package]] -name = "tokio-fs" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" -dependencies = [ - "futures 0.1.30", - "tokio-io", - "tokio-threadpool", -] - -[[package]] -name = "tokio-io" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "log", -] - -[[package]] -name = "tokio-named-pipes" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d282d483052288b2308ba5ee795f5673b159c9bdf63c385a05609da782a5eae" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "mio", - "mio-named-pipes", - "tokio 0.1.22", -] - -[[package]] -name = "tokio-reactor" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.30", - "lazy_static", - "log", - "mio", - "num_cpus", - "parking_lot 0.9.0", - "slab", - "tokio-executor 0.1.10", - "tokio-io", - "tokio-sync 0.1.8", -] - -[[package]] -name = "tokio-rustls" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" -dependencies = [ - "futures-core", - "rustls", - "tokio 0.2.23", - "webpki", -] - -[[package]] -name = "tokio-service" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" -dependencies = [ - "futures 0.1.30", -] - -[[package]] -name = "tokio-sync" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" -dependencies = [ - "fnv", - "futures 0.1.30", -] - -[[package]] -name = "tokio-sync" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1aaeb685540f7407ea0e27f1c9757d258c7c6bf4e3eb19da6fc59b747239d2" -dependencies = [ - "fnv", - "futures-core-preview", - "futures-util-preview", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "iovec", - "mio", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -dependencies = [ - "crossbeam-deque 0.7.3", - "crossbeam-queue", - "crossbeam-utils 0.7.2", - "futures 0.1.30", - "lazy_static", - "log", - "num_cpus", - "slab", - "tokio-executor 0.1.10", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.30", - "slab", - "tokio-executor 0.1.10", -] - -[[package]] -name = "tokio-udp" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "log", - "mio", - "tokio-codec", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-uds" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.30", - "iovec", - "libc", - "log", - "mio", - "mio-uds", - "tokio-codec", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-util" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" -dependencies = [ - "bytes 0.5.6", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.1.11", - "tokio 0.2.23", -] - -[[package]] -name = "toml" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" - -[[package]] -name = "tracing" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" -dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite 0.2.0", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "tracing-futures" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" -dependencies = [ - "pin-project 0.4.27", - "tracing", -] - -[[package]] -name = "tracing-log" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401" -dependencies = [ - "ansi_term 0.12.1", - "chrono", - "lazy_static", - "matchers", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec 1.6.0", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "trie-db" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e55f7ace33d6237e14137e386f4e1672e2a5c6bbc97fef9f438581a143971f0" -dependencies = [ - "hash-db", - "hashbrown 0.8.2", - "log", - "rustc-hex", - "smallvec 1.6.0", -] - -[[package]] -name = "trie-root" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "652931506d2c1244d7217a70b99f56718a7b4161b37f04e7cd868072a99f68cd" -dependencies = [ - "hash-db", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "twox-hash" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f8ab788026715fa63b31960869617cba39117e520eb415b0139543e325ab59" -dependencies = [ - "cfg-if 0.1.10", - "rand 0.7.3", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" - -[[package]] -name = "uint" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9db035e67dfaf7edd9aebfe8676afcd63eed53c8a4044fed514c8cccf1835177" -dependencies = [ - "byteorder 1.3.4", - "crunchy", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" - -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - -[[package]] -name = "unicode-xid" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" - -[[package]] -name = "universal-hash" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" -dependencies = [ - "generic-array 0.14.4", - "subtle 2.3.0", -] - -[[package]] -name = "unsigned-varint" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669d776983b692a906c881fcd0cfb34271a48e197e4d6cb8df32b05bfc3d3fa5" -dependencies = [ - "bytes 0.5.6", - "futures-io", - "futures-util", - "futures_codec", -] - -[[package]] -name = "unsigned-varint" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fdeedbf205afadfe39ae559b75c3240f24e257d0ca27e85f85cb82aa19ac35" -dependencies = [ - "futures-io", - "futures-util", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] - -[[package]] -name = "url" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" -dependencies = [ - "form_urlencoded", - "idna 0.2.0", - "matches", - "percent-encoding 2.1.0", -] - -[[package]] -name = "vcpkg" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" - -[[package]] -name = "vec-arena" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi 0.3.9", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -dependencies = [ - "futures 0.1.30", - "log", - "try-lock", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasm-bindgen" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe9756085a84584ee9457a002b7cdfe0bfff169f45d2591d8be1345a6780e35" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" - -[[package]] -name = "wasm-timer" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" -dependencies = [ - "futures 0.3.8", - "js-sys", - "parking_lot 0.11.1", - "pin-utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wasmi" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf617d864d25af3587aa745529f7aaa541066c876d57e050c0d0c85c61c92aff" -dependencies = [ - "libc", - "memory_units", - "num-rational 0.2.4", - "num-traits", - "parity-wasm", - "wasmi-validation", -] - -[[package]] -name = "wasmi-validation" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea78c597064ba73596099281e2f4cfc019075122a65cdda3205af94f0b264d93" -dependencies = [ - "parity-wasm", -] - -[[package]] -name = "web-sys" -version = "0.3.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8eff4b7516a57307f9349c64bf34caa34b940b66fed4b2fb3136cb7386e5739" -dependencies = [ - "webpki", -] - -[[package]] -name = "wepoll-sys" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" -dependencies = [ - "cc", -] - -[[package]] -name = "which" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" -dependencies = [ - "libc", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "x25519-dalek" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637ff90c9540fa3073bb577e65033069e4bae7c79d49d74aa3ffdf5342a53217" -dependencies = [ - "curve25519-dalek 2.1.0", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "x25519-dalek" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc614d95359fd7afc321b66d2107ede58b246b844cf5d8a0adcca413e439f088" -dependencies = [ - "curve25519-dalek 3.0.0", - "rand_core 0.5.1", - "zeroize", -] - -[[package]] -name = "yamux" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aeb8c4043cac71c3c299dff107171c220d179492350ea198e109a414981b83c" -dependencies = [ - "futures 0.3.8", - "log", - "nohash-hasher", - "parking_lot 0.11.1", - "rand 0.7.3", - "static_assertions", -] - -[[package]] -name = "zeroize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f33972566adbd2d3588b0491eb94b98b43695c4ef897903470ede4f3f5a28a" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] diff --git a/analyses/bench/Cargo.toml b/analyses/bench/Cargo.toml index 02dce36676..6012a4415a 100644 --- a/analyses/bench/Cargo.toml +++ b/analyses/bench/Cargo.toml @@ -10,26 +10,26 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] log = "0.4.8" -node-primitives = { package = 'node-primitives', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -node-runtime = { package = 'node-runtime', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sc-cli = { package = 'sc-cli', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sc-client-api = { package = 'sc-client-api', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-runtime = { package = 'sp-runtime', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-state-machine = { package = 'sp-state-machine', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +node-primitives = { package = 'node-primitives', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +node-runtime = { package = 'node-runtime', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sc-cli = { package = 'sc-cli', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sc-client-api = { package = 'sc-client-api', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-runtime = { package = 'sp-runtime', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-state-machine = { package = 'sp-state-machine', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" kvdb = "0.7" kvdb-rocksdb = "0.9.1" -sp-trie = { package = 'sp-trie', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-core = { package = 'sp-core', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-consensus = { package = 'sp-consensus', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-transaction-pool = { package = 'sp-transaction-pool', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sc-basic-authorship = { package = 'sc-basic-authorship', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-inherents = { package = 'sp-inherents', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-timestamp = { package = 'sp-timestamp', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } -sp-tracing = { package = 'sp-tracing', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-trie = { package = 'sp-trie', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-core = { package = 'sp-core', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-consensus = { package = 'sp-consensus', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-transaction-pool = { package = 'sp-transaction-pool', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sc-basic-authorship = { package = 'sc-basic-authorship', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-inherents = { package = 'sp-inherents', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-timestamp = { package = 'sp-timestamp', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sp-tracing = { package = 'sp-tracing', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } hash-db = "0.15.2" tempfile = "3.1.0" fs_extra = "1" @@ -38,7 +38,7 @@ rand = { version = "0.7.2", features = ["small_rng"] } lazy_static = "1.4.0" parity-util-mem = { version = "0.7.0", default-features = false, features = ["primitive-types"] } parity-db = { version = "0.1.2" } -sc-transaction-pool = { package = 'sc-transaction-pool', git = 'https://github.com/paritytech/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } +sc-transaction-pool = { package = 'sc-transaction-pool', git = 'https://github.com/joystream/substrate.git', rev = 'a200cdb93c6af5763b9c7bf313fa708764ac88ca' } futures = { version = "0.3.4", features = ["thread-pool"] } # Extra diff --git a/bin/inspect/Cargo.toml b/bin/inspect/Cargo.toml new file mode 100644 index 0000000000..67becf669c --- /dev/null +++ b/bin/inspect/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "node-inspect" +version = "0.9.0-dev" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +homepage = "https://substrate.io" +repository = "https://github.com/paritytech/substrate/" + +[dependencies] +clap = { version = "3.1.6", features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.1.5" } +thiserror = "1.0" +sc-cli = { package = 'sc-cli', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-client-api = { package = 'sc-client-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-executor = { package = 'sc-executor', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-service = { package = 'sc-service', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522', default-features = false } +sp-blockchain = { package = 'sp-blockchain', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-core = { package = 'sp-core', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-runtime = { package = 'sp-runtime', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +overrides = { package = "overrides", path = "../overrides" } diff --git a/bin/inspect/src/cli.rs b/bin/inspect/src/cli.rs new file mode 100644 index 0000000000..fb81f53983 --- /dev/null +++ b/bin/inspect/src/cli.rs @@ -0,0 +1,62 @@ +// This file is part of Substrate. + +// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Structs to easily compose inspect sub-command for CLI. + +use sc_cli::{ImportParams, SharedParams}; + +/// The `inspect` command used to print decoded chain data. +#[derive(Debug, clap::Parser)] +pub struct InspectCmd { + #[allow(missing_docs)] + #[clap(subcommand)] + pub command: InspectSubCmd, + + #[allow(missing_docs)] + #[clap(flatten)] + pub shared_params: SharedParams, + + #[allow(missing_docs)] + #[clap(flatten)] + pub import_params: ImportParams, +} + +/// A possible inspect sub-commands. +#[derive(Debug, clap::Subcommand)] +pub enum InspectSubCmd { + /// Decode block with native version of runtime and print out the details. + Block { + /// Address of the block to print out. + /// + /// Can be either a block hash (no 0x prefix) or a number to retrieve existing block, + /// or a 0x-prefixed bytes hex string, representing SCALE encoding of + /// a block. + #[clap(value_name = "HASH or NUMBER or BYTES")] + input: String, + }, + /// Decode extrinsic with native version of runtime and print out the details. + Extrinsic { + /// Address of an extrinsic to print out. + /// + /// Can be either a block hash (no 0x prefix) or number and the index, in the form + /// of `{block}:{index}` or a 0x-prefixed bytes hex string, + /// representing SCALE encoding of an extrinsic. + #[clap(value_name = "BLOCK:INDEX or BYTES")] + input: String, + }, +} diff --git a/bin/inspect/src/command.rs b/bin/inspect/src/command.rs new file mode 100644 index 0000000000..90a226e1ea --- /dev/null +++ b/bin/inspect/src/command.rs @@ -0,0 +1,76 @@ +// This file is part of Substrate. + +// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Command ran by the CLI + +use crate::{ + cli::{InspectCmd, InspectSubCmd}, + Inspector, +}; +use overrides::DEFAULT_HEAP_PAGES; +use sc_cli::{CliConfiguration, ImportParams, Result, SharedParams}; +use sc_executor::NativeElseWasmExecutor; +use sc_service::{new_full_client, Configuration, NativeExecutionDispatch}; +use sp_runtime::traits::Block; +use std::str::FromStr; + +impl InspectCmd { + /// Run the inspect command, passing the inspector. + pub fn run(&self, config: Configuration) -> Result<()> + where + B: Block, + B::Hash: FromStr, + RA: Send + Sync + 'static, + EX: NativeExecutionDispatch + 'static, + { + let executor = NativeElseWasmExecutor::::new( + config.wasm_method, + Some(DEFAULT_HEAP_PAGES), + config.max_runtime_instances, + config.runtime_cache_size, + ); + + let client = new_full_client::(&config, None, executor)?; + let inspect = Inspector::::new(client); + + match &self.command { + InspectSubCmd::Block { input } => { + let input = input.parse()?; + let res = inspect.block(input).map_err(|e| format!("{}", e))?; + println!("{}", res); + Ok(()) + } + InspectSubCmd::Extrinsic { input } => { + let input = input.parse()?; + let res = inspect.extrinsic(input).map_err(|e| format!("{}", e))?; + println!("{}", res); + Ok(()) + } + } + } +} + +impl CliConfiguration for InspectCmd { + fn shared_params(&self) -> &SharedParams { + &self.shared_params + } + + fn import_params(&self) -> Option<&ImportParams> { + Some(&self.import_params) + } +} diff --git a/bin/inspect/src/lib.rs b/bin/inspect/src/lib.rs new file mode 100644 index 0000000000..7e66e3c444 --- /dev/null +++ b/bin/inspect/src/lib.rs @@ -0,0 +1,330 @@ +// This file is part of Substrate. +// +// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! A CLI extension for substrate node, adding sub-command to pretty print debug info +//! about blocks and extrinsics. +//! +//! The blocks and extrinsics can either be retrieved from the database (on-chain), +//! or a raw SCALE-encoding can be provided. + +#![warn(missing_docs)] + +pub mod cli; +pub mod command; + +use codec::{Decode, Encode}; +use sc_client_api::BlockBackend; +use sp_blockchain::HeaderBackend; +use sp_core::hexdisplay::HexDisplay; +use sp_runtime::{ + generic::BlockId, + traits::{Block, Hash, HashFor, NumberFor}, +}; +use std::{fmt, fmt::Debug, marker::PhantomData, str::FromStr}; + +/// A helper type for a generic block input. +pub type BlockAddressFor = + BlockAddress< as Hash>::Output, NumberFor>; + +/// A Pretty formatter implementation. +pub trait PrettyPrinter { + /// Nicely format block. + fn fmt_block(&self, fmt: &mut fmt::Formatter, block: &TBlock) -> fmt::Result; + /// Nicely format extrinsic. + fn fmt_extrinsic(&self, fmt: &mut fmt::Formatter, extrinsic: &TBlock::Extrinsic) + -> fmt::Result; +} + +/// Default dummy debug printer. +#[derive(Default)] +pub struct DebugPrinter; +impl PrettyPrinter for DebugPrinter { + fn fmt_block(&self, fmt: &mut fmt::Formatter, block: &TBlock) -> fmt::Result { + writeln!(fmt, "Header:")?; + writeln!(fmt, "{:?}", block.header())?; + writeln!(fmt, "Block bytes: {:?}", HexDisplay::from(&block.encode()))?; + writeln!(fmt, "Extrinsics ({})", block.extrinsics().len())?; + for (idx, ex) in block.extrinsics().iter().enumerate() { + writeln!(fmt, "- {}:", idx)?; + >::fmt_extrinsic(self, fmt, ex)?; + } + Ok(()) + } + + fn fmt_extrinsic( + &self, + fmt: &mut fmt::Formatter, + extrinsic: &TBlock::Extrinsic, + ) -> fmt::Result { + writeln!(fmt, " {:#?}", extrinsic)?; + writeln!(fmt, " Bytes: {:?}", HexDisplay::from(&extrinsic.encode()))?; + Ok(()) + } +} + +/// Aggregated error for `Inspector` operations. +#[derive(Debug, thiserror::Error)] +#[allow(clippy::large_enum_variant)] +pub enum Error { + /// Could not decode Block or Extrinsic. + #[error(transparent)] + Codec(#[from] codec::Error), + /// Error accessing blockchain DB. + #[error(transparent)] + Blockchain(#[from] sp_blockchain::Error), + /// Given block has not been found. + #[error("{0}")] + NotFound(String), +} + +/// A helper trait to access block headers and bodies. +pub trait ChainAccess: HeaderBackend + BlockBackend {} + +impl ChainAccess for T +where + TBlock: Block, + T: sp_blockchain::HeaderBackend + sc_client_api::BlockBackend, +{ +} + +/// Blockchain inspector. +pub struct Inspector = DebugPrinter> { + printer: TPrinter, + chain: Box>, + _block: PhantomData, +} + +impl> Inspector { + /// Create new instance of the inspector with default printer. + pub fn new(chain: impl ChainAccess + 'static) -> Self + where + TPrinter: Default, + { + Self::with_printer(chain, Default::default()) + } + + /// Customize pretty-printing of the data. + pub fn with_printer(chain: impl ChainAccess + 'static, printer: TPrinter) -> Self { + Inspector { + chain: Box::new(chain) as _, + printer, + _block: Default::default(), + } + } + + /// Get a pretty-printed block. + pub fn block(&self, input: BlockAddressFor) -> Result { + struct BlockPrinter<'a, A, B>(A, &'a B); + impl<'a, A: Block, B: PrettyPrinter> fmt::Display for BlockPrinter<'a, A, B> { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self.1.fmt_block(fmt, &self.0) + } + } + + let block = self.get_block(input)?; + Ok(format!("{}", BlockPrinter(block, &self.printer))) + } + + fn get_block(&self, input: BlockAddressFor) -> Result { + Ok(match input { + BlockAddress::Bytes(bytes) => TBlock::decode(&mut &*bytes)?, + BlockAddress::Number(number) => { + let id = BlockId::number(number); + let not_found = format!("Could not find block {:?}", id); + let body = self + .chain + .block_body(&id)? + .ok_or_else(|| Error::NotFound(not_found.clone()))?; + let header = self + .chain + .header(id)? + .ok_or_else(|| Error::NotFound(not_found.clone()))?; + TBlock::new(header, body) + } + BlockAddress::Hash(hash) => { + let id = BlockId::hash(hash); + let not_found = format!("Could not find block {:?}", id); + let body = self + .chain + .block_body(&id)? + .ok_or_else(|| Error::NotFound(not_found.clone()))?; + let header = self + .chain + .header(id)? + .ok_or_else(|| Error::NotFound(not_found.clone()))?; + TBlock::new(header, body) + } + }) + } + + /// Get a pretty-printed extrinsic. + pub fn extrinsic( + &self, + input: ExtrinsicAddress< as Hash>::Output, NumberFor>, + ) -> Result { + struct ExtrinsicPrinter<'a, A: Block, B>(A::Extrinsic, &'a B); + impl<'a, A: Block, B: PrettyPrinter> fmt::Display for ExtrinsicPrinter<'a, A, B> { + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self.1.fmt_extrinsic(fmt, &self.0) + } + } + + let ext = match input { + ExtrinsicAddress::Block(block, index) => { + let block = self.get_block(block)?; + block.extrinsics().get(index).cloned().ok_or_else(|| { + Error::NotFound(format!( + "Could not find extrinsic {} in block {:?}", + index, block + )) + })? + } + ExtrinsicAddress::Bytes(bytes) => TBlock::Extrinsic::decode(&mut &*bytes)?, + }; + + Ok(format!("{}", ExtrinsicPrinter(ext, &self.printer))) + } +} + +/// A block to retrieve. +#[derive(Debug, Clone, PartialEq)] +pub enum BlockAddress { + /// Get block by hash. + Hash(Hash), + /// Get block by number. + Number(Number), + /// Raw SCALE-encoded bytes. + Bytes(Vec), +} + +impl FromStr for BlockAddress { + type Err = String; + + fn from_str(s: &str) -> Result { + // try to parse hash first + if let Ok(hash) = s.parse() { + return Ok(Self::Hash(hash)); + } + + // then number + if let Ok(number) = s.parse() { + return Ok(Self::Number(number)); + } + + // then assume it's bytes (hex-encoded) + sp_core::bytes::from_hex(s).map(Self::Bytes).map_err(|e| { + format!( + "Given string does not look like hash or number. It could not be parsed as bytes either: {}", + e + ) + }) + } +} + +/// An extrinsic address to decode and print out. +#[derive(Debug, Clone, PartialEq)] +pub enum ExtrinsicAddress { + /// Extrinsic as part of existing block. + Block(BlockAddress, usize), + /// Raw SCALE-encoded extrinsic bytes. + Bytes(Vec), +} + +impl FromStr for ExtrinsicAddress { + type Err = String; + + fn from_str(s: &str) -> Result { + // first try raw bytes + // sp_core::bytes is an alias for impl_serde::serialize + // Behavior we expect is only in v0.3.1, unit tests will break with v0.3.2 + if let Ok(bytes) = sp_core::bytes::from_hex(s).map(Self::Bytes) { + return Ok(bytes); + } + + // split by a bunch of different characters + let mut it = s.split(|c| c == '.' || c == ':' || c == ' '); + let block = it + .next() + .expect("First element of split iterator is never empty; qed") + .parse()?; + + let index = it + .next() + .ok_or("Extrinsic index missing: example \"5:0\"")? + .parse() + .map_err(|e| format!("Invalid index format: {}", e))?; + + Ok(Self::Block(block, index)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use sp_core::hash::H160 as Hash; + + #[test] + fn should_parse_block_strings() { + type BlockAddress = super::BlockAddress; + + let b0 = BlockAddress::from_str("3BfC20f0B9aFcAcE800D73D2191166FF16540258"); + let b1 = BlockAddress::from_str("1234"); + let b2 = BlockAddress::from_str("0"); + let b3 = BlockAddress::from_str("0x0012345f"); + + assert_eq!( + b0, + Ok(BlockAddress::Hash( + "3BfC20f0B9aFcAcE800D73D2191166FF16540258".parse().unwrap() + )) + ); + assert_eq!(b1, Ok(BlockAddress::Number(1234))); + assert_eq!(b2, Ok(BlockAddress::Number(0))); + assert_eq!(b3, Ok(BlockAddress::Bytes(vec![0, 0x12, 0x34, 0x5f]))); + } + + // If you find these tests breaking + // Make sure Cargo.lock has pacakge impl_serde using v0.3.1 + // unit tests will break with v0.3.2 (see notes above for impl of from_str for ExtrinsicAddress) + #[test] + fn should_parse_extrinsic_address() { + type BlockAddress = super::BlockAddress; + type ExtrinsicAddress = super::ExtrinsicAddress; + + let e0 = ExtrinsicAddress::from_str("1234"); + let b0 = ExtrinsicAddress::from_str("3BfC20f0B9aFcAcE800D73D2191166FF16540258:5"); + let b1 = ExtrinsicAddress::from_str("1234:0"); + let b2 = ExtrinsicAddress::from_str("0 0"); + let b3 = ExtrinsicAddress::from_str("0x0012345f"); + + assert_eq!(e0, Err("Extrinsic index missing: example \"5:0\"".into())); + assert_eq!( + b0, + Ok(ExtrinsicAddress::Block( + BlockAddress::Hash("3BfC20f0B9aFcAcE800D73D2191166FF16540258".parse().unwrap()), + 5 + )) + ); + assert_eq!( + b1, + Ok(ExtrinsicAddress::Block(BlockAddress::Number(1234), 0)) + ); + assert_eq!(b2, Ok(ExtrinsicAddress::Block(BlockAddress::Number(0), 0))); + assert_eq!(b3, Ok(ExtrinsicAddress::Bytes(vec![0, 0x12, 0x34, 0x5f]))); + } +} diff --git a/bin/node/Cargo.toml b/bin/node/Cargo.toml new file mode 100644 index 0000000000..8282cdabf4 --- /dev/null +++ b/bin/node/Cargo.toml @@ -0,0 +1,147 @@ +[package] +authors = ['Joystream contributors'] +build = 'build.rs' +edition = '2018' +name = 'joystream-node' +version = '8.0.0' +default-run = "joystream-node" + +[[bin]] +name = 'joystream-node' +path = 'bin/main.rs' + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +# third-party dependencies +clap = { version = "3.1.18", features = ["derive"], optional = true } +codec = { package = "parity-scale-codec", version = "3.1.5" } +serde = { version = "1.0.136", features = ["derive"] } +jsonrpsee = { version = "0.13.0", features = ["server"] } +futures = "0.3.21" +hex-literal = "0.3.4" +log = "0.4.17" +rand = "0.8" +hex = { version = "0.4.2" } + +# primitives +sp-authority-discovery = { package = 'sp-authority-discovery', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-consensus-babe = { package = 'sp-consensus-babe', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +grandpa-primitives = { package = "sp-finality-grandpa", git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-api = { package = 'sp-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-core = { package = 'sp-core', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-runtime = { package = 'sp-runtime', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-timestamp = { package = 'sp-timestamp', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-authorship = { package = 'sp-authorship', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-inherents = { package = 'sp-inherents', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-keyring = { package = 'sp-keyring', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-keystore = { package = 'sp-keystore', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-consensus = { package = 'sp-consensus', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-transaction-pool = { package = 'sp-transaction-pool', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-transaction-storage-proof = { package = 'sp-transaction-storage-proof', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-block-builder = { package = 'sp-block-builder', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-blockchain = { package = 'sp-blockchain', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} + +# client dependencies +sc-client-api = { package = 'sc-client-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-chain-spec = { package = 'sc-chain-spec', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus = { package = 'sc-consensus', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-transaction-pool = { package = 'sc-transaction-pool', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-transaction-pool-api = { package = 'sc-transaction-pool-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-network = { package = 'sc-network', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-slots = { package = 'sc-consensus-slots', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-babe = { package = 'sc-consensus-babe', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-babe-rpc = { package = 'sc-consensus-babe-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-epochs = { package = 'sc-consensus-epochs', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-uncles = { package = 'sc-consensus-uncles', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-finality-grandpa = { package = "sc-finality-grandpa", git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-finality-grandpa-rpc = { package = 'sc-finality-grandpa-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-rpc = { package = 'sc-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-rpc-api = { package = 'sc-rpc-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-basic-authorship = { package = 'sc-basic-authorship', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-service = { package = 'sc-service', default-features = false, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-telemetry = { package = 'sc-telemetry', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-executor = { package = 'sc-executor', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-authority-discovery = { package = 'sc-authority-discovery', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-sync-state-rpc = { package = 'sc-sync-state-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-sysinfo = { package = 'sc-sysinfo', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-transaction-payment-rpc = { package = 'pallet-transaction-payment-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +substrate-frame-rpc-system = { package = 'substrate-frame-rpc-system', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +substrate-state-trie-migration-rpc = { package = 'substrate-state-trie-migration-rpc', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} + +# frame dependencies +frame-system = { package = 'frame-system',git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +frame-system-rpc-runtime-api = { package = 'frame-system-rpc-runtime-api', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-transaction-payment = { package = 'pallet-transaction-payment', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-im-online = { package = 'pallet-im-online', default-features = false, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-staking = { package = 'pallet-staking', default-features = false, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-transaction-storage = { package = 'pallet-transaction-storage', default-features = false, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} + +# node-specific dependencies +node-runtime = { package = "joystream-node-runtime", path = "../../runtime" } + +# overrides +overrides = { package = "overrides", path = "../overrides" } + +# CLI-specific dependencies +sc-cli = { package = 'sc-cli', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +frame-benchmarking-cli = { package = 'frame-benchmarking-cli', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +frame-benchmarking = { package = 'frame-benchmarking', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +serde_json = "1.0.79" +node-inspect = { path = "../inspect", optional = true } + +[target.'cfg(any(target_arch="x86_64", target_arch="aarch64"))'.dependencies] +sc-cli = { package = 'sc-cli', optional = true, features = ["wasmtime"], git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-service = { package = 'sc-service', default-features = false, features = ["wasmtime"], git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-trie = { package = 'sp-trie', default-features = false, features = ["memory-tracker"], git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} + +[dev-dependencies] +sc-keystore = { package = 'sc-keystore', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-client-db = { package = 'sc-client-db', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus = { package = 'sc-consensus', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-babe = { package = 'sc-consensus-babe', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-consensus-epochs = { package = 'sc-consensus-epochs', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-service-test = { package = 'sc-service-test', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-block-builder = { package = 'sc-block-builder', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-tracing = { package = 'sp-tracing', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sp-blockchain = { package = 'sp-blockchain', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +futures = "0.3.21" +tempfile = "3.1.0" +assert_cmd = "2.0.2" +nix = "0.23" +serde_json = "1.0" +regex = "1.5.5" +platforms = "2.0" +async-std = { version = "1.11.0", features = ["attributes"] } +soketto = "0.7.1" +criterion = { version = "0.3.5", features = ["async_tokio"] } +tokio = { version = "1.17.0", features = ["macros", "time", "parking_lot"] } +wait-timeout = "0.2" +remote-externalities = { package = 'remote-externalities', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-timestamp = { package = 'pallet-timestamp', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} + +[build-dependencies] +clap = { version = "3.1.18", optional = true } +clap_complete = { version = "3.0", optional = true } +frame-benchmarking-cli = { package = 'frame-benchmarking-cli', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +substrate-build-script-utils = { package = 'substrate-build-script-utils', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +substrate-frame-cli = { package = 'substrate-frame-cli', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +sc-cli = { package = 'sc-cli', optional = true, git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +pallet-balances = { package = 'pallet-balances', git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522'} +node-inspect = { path = "../inspect", optional = true } + +[features] +default = ["cli"] +cli = [ + "sc-cli", + "frame-benchmarking-cli", + "substrate-frame-cli", + "sc-service/db", + "clap", + "clap_complete", + "substrate-build-script-utils", + "node-inspect", +] + +runtime-benchmarks = ["node-runtime/runtime-benchmarks", "frame-benchmarking-cli"] diff --git a/node/LICENSE b/bin/node/LICENSE similarity index 100% rename from node/LICENSE rename to bin/node/LICENSE diff --git a/node/README.md b/bin/node/README.md similarity index 78% rename from node/README.md rename to bin/node/README.md index 5f8dbce548..b83e976d1b 100644 --- a/node/README.md +++ b/bin/node/README.md @@ -4,8 +4,6 @@ The joystream-node is the main server application that connects to the network, synchronizes the blockchain with other nodes and produces blocks if configured as a validator node. -A step by step guide to setup a full node and validator on the Joystream testnet, can be found [here](https://github.com/Joystream/helpdesk/tree/master/roles/validators). - ### Pre-built binaries The latest pre-built binaries can be downloaded from the [releases](https://github.com/Joystream/joystream/releases) page. @@ -26,7 +24,7 @@ cd joystream/ Compile the node and runtime: ```bash -WASM_BUILD_TOOLCHAIN=nightly-2021-02-20 cargo +nightly-2021-02-20 build --release +WASM_BUILD_TOOLCHAIN=nightly-2022-05-11 cargo +nightly-2022-05-11 build --release ``` This produces the binary in `./target/release/joystream-node` @@ -49,7 +47,7 @@ this script will build and run a fresh new local development chain (purging exis Use the `--chain` argument, and specify the path to the genesis `chain.json` file for that public network. The JSON "chain spec" files for Joystream public networks can be found in [../testnets/](../testnets/). ```bash -./target/release/joystream-node --chain testnets/joy-testnet-5.json +./target/release/joystream-node --chain joy-mainnet.json ``` ### Tests and code quality @@ -57,7 +55,7 @@ Use the `--chain` argument, and specify the path to the genesis `chain.json` fil Running unit tests: ```bash -cargo +nightly-2021-02-20 test --release --all +cargo +nightly-2022-05-11 test --release --all ``` Running full suite of checks, tests, formatting and linting: @@ -79,11 +77,11 @@ If you are building a tagged release from `master` branch and want to install th This will install the executable `joystream-node` to your `~/.cargo/bin` folder, which you would normally have in your `$PATH` environment. ```bash -WASM_BUILD_TOOLCHAIN=nightly-2021-02-20 cargo +nightly-2021-02-20 install joystream-node --path node/ --locked +WASM_BUILD_TOOLCHAIN=nightly-2022-05-11 cargo +nightly-2022-05-11 install joystream-node --path node/ --locked ``` Now you can run and connect to the testnet: ```bash -joystream-node --chain testnets/joy-testnet-5.json +joystream-node --chain joy-mainnet.json ``` diff --git a/node/bin/main.rs b/bin/node/bin/main.rs similarity index 100% rename from node/bin/main.rs rename to bin/node/bin/main.rs diff --git a/node/build.rs b/bin/node/build.rs similarity index 79% rename from node/build.rs rename to bin/node/build.rs index f148b56c32..13cf9d12e2 100644 --- a/node/build.rs +++ b/bin/node/build.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// Copyright (C) 2017-2022 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 // This program is free software: you can redistribute it and/or modify @@ -25,7 +25,8 @@ fn main() { mod cli { include!("src/cli.rs"); - use sc_cli::structopt::clap::Shell; + use clap::{ArgEnum, CommandFactory}; + use clap_complete::{generate_to, Shell}; use std::{env, fs, path::Path}; use substrate_build_script_utils::{generate_cargo_keys, rerun_if_git_head_changed}; @@ -37,15 +38,8 @@ mod cli { } /// Build shell completion scripts for all known shells - /// Full list in https://github.com/kbknapp/clap-rs/blob/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9/src/app/parser.rs#L123 fn build_shell_completion() { - for shell in &[ - Shell::Bash, - Shell::Fish, - Shell::Zsh, - Shell::Elvish, - Shell::PowerShell, - ] { + for shell in Shell::value_variants() { build_completion(shell); } } @@ -67,6 +61,6 @@ mod cli { fs::create_dir(&path).ok(); - Cli::clap().gen_completions("joystream-node", *shell, &path); + let _ = generate_to(*shell, &mut Cli::command(), "joystream-node", &path); } } diff --git a/bin/node/src/chain_spec/content_config.rs b/bin/node/src/chain_spec/content_config.rs new file mode 100644 index 0000000000..afc2ead2f6 --- /dev/null +++ b/bin/node/src/chain_spec/content_config.rs @@ -0,0 +1,64 @@ +use node_runtime::{ + constants::{currency, MINUTES}, + days, dollars, hours, ChannelStateBloatBondValue, ContentConfig, ExpectedBlockTime, + VideoStateBloatBondValue, +}; +use sp_runtime::Perbill; + +pub fn production_config() -> ContentConfig { + ContentConfig { + next_curator_group_id: 1, + next_channel_id: 1, + next_video_id: 1, + next_transfer_id: 1, + max_cashout_allowed: dollars!(100_000), + min_cashout_allowed: dollars!(10), + channel_cashouts_enabled: true, + min_auction_duration: hours!(1), + max_auction_duration: days!(30), + min_auction_extension_period: 0, + max_auction_extension_period: days!(30), + min_bid_lock_duration: 0, + max_bid_lock_duration: hours!(1), + min_starting_price: dollars!(1), + max_starting_price: dollars!(500_000), + min_creator_royalty: Perbill::from_percent(0), + max_creator_royalty: Perbill::from_percent(10), + min_bid_step: dollars!(1), + max_bid_step: dollars!(10_000), + platform_fee_percentage: Perbill::from_percent(2), + auction_starts_at_max_delta: days!(100), + nft_limits_enabled: true, + channel_state_bloat_bond_value: ChannelStateBloatBondValue::get(), + video_state_bloat_bond_value: VideoStateBloatBondValue::get(), + } +} + +pub fn testing_config() -> ContentConfig { + ContentConfig { + next_curator_group_id: 1, + next_channel_id: 1, + next_video_id: 1, + next_transfer_id: 1, + max_cashout_allowed: dollars!(100_000), + min_cashout_allowed: dollars!(10), + channel_cashouts_enabled: true, + min_auction_duration: MINUTES, + max_auction_duration: days!(30), + min_auction_extension_period: 0, + max_auction_extension_period: days!(30), + min_bid_lock_duration: 0, + max_bid_lock_duration: hours!(1), + min_starting_price: dollars!(1), + max_starting_price: dollars!(500_000), + min_creator_royalty: Perbill::from_percent(0), + max_creator_royalty: Perbill::from_percent(10), + min_bid_step: dollars!(1), + max_bid_step: dollars!(10_000), + platform_fee_percentage: Perbill::from_percent(2), + auction_starts_at_max_delta: days!(100), + nft_limits_enabled: false, + channel_state_bloat_bond_value: ChannelStateBloatBondValue::get(), + video_state_bloat_bond_value: VideoStateBloatBondValue::get(), + } +} diff --git a/bin/node/src/chain_spec/council_config.rs b/bin/node/src/chain_spec/council_config.rs new file mode 100644 index 0000000000..b67f2f3b07 --- /dev/null +++ b/bin/node/src/chain_spec/council_config.rs @@ -0,0 +1,16 @@ +use node_runtime::{ + constants::currency, council::CouncilStageUpdate, days, dollars, hours, + monthly_dollars_to_per_block, Balance, CouncilConfig, ExpectedBlockTime, +}; + +pub fn create_council_config() -> CouncilConfig { + CouncilConfig { + stage: CouncilStageUpdate::default(), + announcement_period_nr: 0, + budget: 0, + next_reward_payments: 0, + next_budget_refill: 1, + budget_increment: dollars!(22_000), + councilor_reward: monthly_dollars_to_per_block!(10_000), + } +} diff --git a/bin/node/src/chain_spec/forum_config.rs b/bin/node/src/chain_spec/forum_config.rs new file mode 100644 index 0000000000..b7c2c3a1cb --- /dev/null +++ b/bin/node/src/chain_spec/forum_config.rs @@ -0,0 +1,11 @@ +use node_runtime::ForumConfig; + +/// Generates a basic empty `ForumConfig` geneis config +pub fn empty() -> ForumConfig { + ForumConfig { + next_category_id: 1, + next_thread_id: 1, + next_post_id: 1, + category_counter: 0, + } +} diff --git a/bin/node/src/chain_spec/initial_balances.rs b/bin/node/src/chain_spec/initial_balances.rs new file mode 100644 index 0000000000..81d3a8ee8a --- /dev/null +++ b/bin/node/src/chain_spec/initial_balances.rs @@ -0,0 +1,41 @@ +use node_runtime::{constants::currency, AccountId, Balance, BlockNumber}; +use serde::Deserialize; +use std::{fs, path::Path}; + +#[derive(Deserialize)] +struct SerializedInitialBalances { + // (who, total balance) + balances: Vec<(AccountId, Balance)>, + // (who, begin, length, liquid) + vesting: Vec<(AccountId, BlockNumber, BlockNumber, Balance)>, +} + +fn parse_json(data_file: &Path) -> SerializedInitialBalances { + let data = fs::read_to_string(data_file).expect("Failed reading file"); + serde_json::from_str(&data).expect("failed parsing balances data") +} + +/// Deserializes initial balances from json file +pub fn balances_from_json(data_file: &Path) -> Vec<(AccountId, Balance)> { + parse_json(data_file) + .balances + .into_iter() + .map(|(account, balance)| (account, balance.saturating_mul(currency::BASE_UNIT_PER_JOY))) + .collect() +} + +/// Deserializes initial vesting config from json file +pub fn vesting_from_json(data_file: &Path) -> Vec<(AccountId, BlockNumber, BlockNumber, Balance)> { + parse_json(data_file) + .vesting + .into_iter() + .map(|(account, begin, length, liquid)| { + ( + account, + begin, + length, + liquid.saturating_mul(currency::BASE_UNIT_PER_JOY), + ) + }) + .collect() +} diff --git a/bin/node/src/chain_spec/mod.rs b/bin/node/src/chain_spec/mod.rs new file mode 100644 index 0000000000..eb9ad74184 --- /dev/null +++ b/bin/node/src/chain_spec/mod.rs @@ -0,0 +1,545 @@ +// Copyright 2019 Joystream Contributors +// This file is part of Joystream node. + +// Joystream node is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Joystream node is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Joystream node. If not, see . + +// Clippy linter warning. +// Disable it because we use such syntax for a code readability. +// Example: voting_period: 1 * DAY +#![allow(clippy::identity_op)] + +pub mod content_config; +pub mod council_config; +pub mod forum_config; +pub mod initial_balances; +pub mod project_token_config; +pub mod storage_config; + +pub use grandpa_primitives::AuthorityId as GrandpaId; + +use node_runtime::{ + constants::currency::{DOLLARS, MIN_NOMINATOR_BOND, MIN_VALIDATOR_BOND}, + wasm_binary_unwrap, AuthorityDiscoveryConfig, BabeConfig, BalancesConfig, Block, ContentConfig, + ExistentialDeposit, GrandpaConfig, ImOnlineConfig, MaxNominations, ProjectTokenConfig, + SessionConfig, SessionKeys, StakerStatus, StakingConfig, StorageConfig, SudoConfig, + SystemConfig, TransactionPaymentConfig, VestingConfig, +}; +pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; +use sc_chain_spec::ChainSpecExtension; +use sc_service::ChainType; + +use pallet_staking::Forcing; +use serde::{Deserialize, Serialize}; +use serde_json as json; +pub use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; +pub use sp_consensus_babe::AuthorityId as BabeId; +use sp_core::{sr25519, Pair, Public}; +use sp_runtime::{ + traits::{IdentifyAccount, Verify}, + Perbill, +}; + +pub use node_runtime::constants::JOY_ADDRESS_PREFIX; +pub use node_runtime::primitives::{AccountId, Balance, BlockNumber, Signature}; +pub use node_runtime::GenesisConfig; + +type AccountPublic = ::Signer; + +/// Node `ChainSpec` extensions. +/// +/// Additional parameters for some Substrate core modules, +/// customizable from the chain spec. +#[derive(Default, Clone, Serialize, Deserialize, ChainSpecExtension)] +#[serde(rename_all = "camelCase")] +pub struct Extensions { + /// Block numbers with known hashes. + pub fork_blocks: sc_client_api::ForkBlocks, + /// Known bad block hashes. + pub bad_blocks: sc_client_api::BadBlocks, + /// The light sync state extension used by the sync-state rpc. + pub light_sync_state: sc_sync_state_rpc::LightSyncStateExtension, +} + +/// Specialized `ChainSpec`. +pub type ChainSpec = sc_service::GenericChainSpec; + +pub fn session_keys( + grandpa: GrandpaId, + babe: BabeId, + im_online: ImOnlineId, + authority_discovery: AuthorityDiscoveryId, +) -> SessionKeys { + SessionKeys { + grandpa, + babe, + im_online, + authority_discovery, + } +} + +/// Helper function to generate a crypto pair from seed +pub fn get_from_seed(seed: &str) -> ::Public { + let password = None; + TPublic::Pair::from_string(seed, password) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate an account ID from seed +pub fn get_account_id_from_seed(seed: &str) -> AccountId +where + AccountPublic: From<::Public>, +{ + AccountPublic::from(get_from_seed::(seed)).into_account() +} + +/// Helper function to generate stash, controller and session key from seed +pub fn authority_keys_from_seed( + seed: &str, +) -> ( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, +) { + ( + get_account_id_from_seed::(&format!("{}//stash", seed)), + get_account_id_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + ) +} + +// Accounts to endow on dev and local test networks +fn development_endowed_accounts() -> Vec { + vec![ + get_account_id_from_seed::("//Alice"), + get_account_id_from_seed::("//Bob"), + get_account_id_from_seed::("//Charlie"), + get_account_id_from_seed::("//Dave"), + get_account_id_from_seed::("//Eve"), + get_account_id_from_seed::("//Ferdie"), + get_account_id_from_seed::("//Alice//stash"), + get_account_id_from_seed::("//Bob//stash"), + get_account_id_from_seed::("//Charlie//stash"), + get_account_id_from_seed::("//Dave//stash"), + get_account_id_from_seed::("//Eve//stash"), + get_account_id_from_seed::("//Ferdie//stash"), + ] +} + +pub fn joy_chain_spec_properties() -> json::map::Map { + let mut properties: json::map::Map = json::map::Map::new(); + properties.insert( + String::from("tokenDecimals"), + json::Value::Number(json::Number::from(10)), + ); + properties.insert( + String::from("tokenSymbol"), + json::Value::String(String::from("JOY")), + ); + properties.insert( + String::from("ss58Format"), + json::Value::Number(json::Number::from(JOY_ADDRESS_PREFIX)), + ); + properties +} + +#[allow(clippy::too_many_arguments)] +/// Helper function to create GenesisConfig for testing +pub fn testnet_genesis( + fund_accounts: bool, + initial_authorities: Vec<( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, + )>, + initial_nominators: Vec, + root_key: AccountId, + endowed_accounts: Vec, + mut genesis_balances: Vec<(AccountId, Balance)>, + vesting_accounts: Vec<(AccountId, BlockNumber, BlockNumber, Balance)>, + content_cfg: ContentConfig, + storage_cfg: StorageConfig, + project_token_cfg: ProjectTokenConfig, +) -> GenesisConfig { + // staking benchmakrs is not sensitive to actual value of min bonds so + // accounts are not funded with sufficient funds and fail with InsufficientBond err + // so for benchmarks we set min bond to zero. + const GENESIS_MIN_NOMINATOR_BOND: Balance = if cfg!(feature = "runtime-benchmarks") { + 0 + } else { + MIN_NOMINATOR_BOND + }; + const GENESIS_MIN_VALIDATOR_BOND: Balance = if cfg!(feature = "runtime-benchmarks") { + 0 + } else { + MIN_VALIDATOR_BOND + }; + + // How much each initial validator at genesis will bond + let initial_validator_bond: Balance = GENESIS_MIN_VALIDATOR_BOND + .saturating_mul(4) + .saturating_add(ExistentialDeposit::get()); + // How much each initial nominator at genesis will bond per nomination + let initial_nominator_bond: Balance = + GENESIS_MIN_NOMINATOR_BOND.saturating_add(ExistentialDeposit::get()); + + let mut funded: Vec = genesis_balances + .iter() + .cloned() + .map(|(account, _)| account) + .collect(); + + // For every account missing from genesis_balances add it and fund it + if fund_accounts { + // Genesis balance for each endowed account. + let endowment: Balance = DOLLARS + .saturating_mul(1_000_000) + .max(initial_validator_bond) + .max(if !initial_nominators.is_empty() { + initial_nominator_bond.saturating_mul(initial_authorities.len() as u128) + } else { + 0 + }); + + initial_authorities.iter().for_each(|x| { + // stash + if !funded.contains(&x.0) { + funded.push(x.0.clone()); + genesis_balances.push((x.0.clone(), endowment)); + } + // controller + if !funded.contains(&x.1) { + funded.push(x.1.clone()); + genesis_balances.push((x.1.clone(), endowment)); + } + }); + + initial_nominators.iter().for_each(|account| { + if !funded.contains(account) { + funded.push(account.clone()); + genesis_balances.push((account.clone(), endowment)); + } + }); + + endowed_accounts.iter().for_each(|account| { + if !funded.contains(account) { + funded.push(account.clone()); + genesis_balances.push((account.clone(), endowment)); + } + }); + + if !funded.contains(&root_key) { + funded.push(root_key.clone()); + genesis_balances.push((root_key.clone(), endowment)); + } + } + + // Make sure sudo is in initial balances sufficient funds + if !genesis_balances + .iter() + .cloned() + .any(|(account, _)| account == root_key) + { + println!("# WARNING - root_key is not assigned an initial balance"); + } + + // stakers: all validators and nominators. + let mut rng = rand::thread_rng(); + let stakers = initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.1.clone(), + initial_validator_bond, + StakerStatus::Validator, + ) + }) + .chain(initial_nominators.iter().map(|x| { + use rand::{seq::SliceRandom, Rng}; + let limit = (MaxNominations::get() as usize).min(initial_authorities.len()); + let count = (rng.gen::() % limit).saturating_add(1); // at least one nomination + let nominations = initial_authorities + .as_slice() + .choose_multiple(&mut rng, count) + .into_iter() + .map(|choice| choice.0.clone()) + .collect::>(); + ( + x.clone(), + x.clone(), + initial_nominator_bond, + StakerStatus::Nominator(nominations), + ) + })) + .collect::>(); + + GenesisConfig { + system: SystemConfig { + code: wasm_binary_unwrap().to_vec(), + }, + balances: BalancesConfig { + balances: genesis_balances, + }, + session: SessionConfig { + keys: initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone()), + ) + }) + .collect::>(), + }, + staking: StakingConfig { + validator_count: initial_authorities.len() as u32, + minimum_validator_count: initial_authorities.len().min(4) as u32, + invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), + slash_reward_fraction: Perbill::from_percent(10), + force_era: Forcing::ForceNone, + stakers, + min_nominator_bond: GENESIS_MIN_NOMINATOR_BOND, + min_validator_bond: GENESIS_MIN_VALIDATOR_BOND, + history_depth: 120, + max_validator_count: Some(400), + max_nominator_count: Some(20_000), + ..Default::default() + }, + sudo: SudoConfig { + key: Some(root_key), + }, + babe: BabeConfig { + authorities: vec![], + epoch_config: Some(node_runtime::BABE_GENESIS_EPOCH_CONFIG), + }, + im_online: ImOnlineConfig { keys: vec![] }, + authority_discovery: AuthorityDiscoveryConfig { keys: vec![] }, + grandpa: GrandpaConfig { + authorities: vec![], + }, + transaction_payment: TransactionPaymentConfig {}, + vesting: VestingConfig { + vesting: vesting_accounts, + }, + council: council_config::create_council_config(), + forum: forum_config::empty(), + content: content_cfg, + storage: storage_cfg, + project_token: project_token_cfg, + proposals_discussion: Default::default(), + members: Default::default(), + } +} + +fn development_config_genesis() -> GenesisConfig { + testnet_genesis( + true, + vec![authority_keys_from_seed("//Alice")], + vec![ + get_account_id_from_seed::("//Bob"), + get_account_id_from_seed::("//Charlie"), + ], + get_account_id_from_seed::("//Alice"), + development_endowed_accounts(), + vec![], + vec![], + content_config::testing_config(), + storage_config::testing_config(), + project_token_config::testing_config(), + ) +} + +/// Development config (single validator Alice) +pub fn development_config() -> ChainSpec { + ChainSpec::from_genesis( + "Development", + "dev", + ChainType::Development, + development_config_genesis, + vec![], + None, + None, + None, + Some(joy_chain_spec_properties()), + Default::default(), + ) +} + +fn local_testnet_genesis() -> GenesisConfig { + testnet_genesis( + true, + vec![ + authority_keys_from_seed("//Alice"), + authority_keys_from_seed("//Bob"), + ], + vec![], + get_account_id_from_seed::("//Alice"), + development_endowed_accounts(), + vec![], + vec![], + content_config::testing_config(), + storage_config::testing_config(), + project_token_config::testing_config(), + ) +} + +/// Local testnet config (multivalidator Alice + Bob) +pub fn local_testnet_config() -> ChainSpec { + ChainSpec::from_genesis( + "Local Testnet", + "local_testnet", + ChainType::Local, + local_testnet_genesis, + vec![], + None, + None, + None, + Some(joy_chain_spec_properties()), + Default::default(), + ) +} + +fn prod_test_config_genesis() -> GenesisConfig { + testnet_genesis( + true, + vec![authority_keys_from_seed("//Alice")], + vec![], + get_account_id_from_seed::("//Alice"), + development_endowed_accounts(), + vec![], + vec![], + content_config::production_config(), + storage_config::production_config(), + project_token_config::production_config(), + ) +} + +/// Development chain, with production config +pub fn prod_test_config() -> ChainSpec { + ChainSpec::from_genesis( + "Development", + "dev", + ChainType::Development, + prod_test_config_genesis, + vec![], + None, + None, + None, + Some(joy_chain_spec_properties()), + Default::default(), + ) +} + +#[cfg(test)] +pub(crate) mod tests { + use super::*; + use crate::service::{new_full_base, NewFullBase}; + use sc_service_test; + use sp_runtime::BuildStorage; + + fn local_testnet_genesis_instant_single() -> GenesisConfig { + testnet_genesis( + true, + vec![authority_keys_from_seed("//Alice")], + vec![], + get_account_id_from_seed::("//Alice"), + development_endowed_accounts(), + vec![], + vec![], + content_config::testing_config(), + storage_config::testing_config(), + project_token_config::testing_config(), + ) + } + + /// Local testnet config (single validator - Alice) + pub fn integration_test_config_with_single_authority() -> ChainSpec { + ChainSpec::from_genesis( + "Integration Test", + "test", + ChainType::Development, + local_testnet_genesis_instant_single, + vec![], + None, + None, + None, + Some(joy_chain_spec_properties()), + Default::default(), + ) + } + + /// Local testnet config (multivalidator Alice + Bob) + pub fn integration_test_config_with_two_authorities() -> ChainSpec { + ChainSpec::from_genesis( + "Integration Test", + "test", + ChainType::Development, + local_testnet_genesis, + vec![], + None, + None, + None, + Some(joy_chain_spec_properties()), + Default::default(), + ) + } + + #[test] + #[ignore] + fn test_connectivity() { + sp_tracing::try_init_simple(); + + sc_service_test::connectivity(integration_test_config_with_two_authorities(), |config| { + let NewFullBase { + task_manager, + client, + network, + transaction_pool, + .. + } = new_full_base(config, false, |_, _| ())?; + Ok(sc_service_test::TestNetComponents::new( + task_manager, + client, + network, + transaction_pool, + )) + }); + } + + #[test] + fn test_create_development_chain_spec() { + development_config().build_storage().unwrap(); + } + + #[test] + fn test_create_local_testnet_chain_spec() { + local_testnet_config().build_storage().unwrap(); + } + + #[test] + fn test_create_prod_test_chain_spec() { + prod_test_config().build_storage().unwrap(); + } +} diff --git a/bin/node/src/chain_spec/project_token_config.rs b/bin/node/src/chain_spec/project_token_config.rs new file mode 100644 index 0000000000..95712237ac --- /dev/null +++ b/bin/node/src/chain_spec/project_token_config.rs @@ -0,0 +1,28 @@ +use node_runtime::{ + days, hours, ExpectedBlockTime, ProjectTokenAccountBloatBond, ProjectTokenConfig, +}; +use sp_runtime::Permill; + +pub fn production_config() -> ProjectTokenConfig { + ProjectTokenConfig { + next_token_id: 0, + bloat_bond: ProjectTokenAccountBloatBond::get(), + min_sale_duration: days!(1), + min_revenue_split_duration: days!(21), + min_revenue_split_time_to_start: 0, + sale_platform_fee: Permill::from_percent(2), + ..Default::default() + } +} + +pub fn testing_config() -> ProjectTokenConfig { + ProjectTokenConfig { + next_token_id: 0, + bloat_bond: ProjectTokenAccountBloatBond::get(), + min_sale_duration: 1, + min_revenue_split_duration: 5, + min_revenue_split_time_to_start: 0, + sale_platform_fee: Permill::from_percent(2), + ..Default::default() + } +} diff --git a/bin/node/src/chain_spec/storage_config.rs b/bin/node/src/chain_spec/storage_config.rs new file mode 100644 index 0000000000..2f1ce9fa83 --- /dev/null +++ b/bin/node/src/chain_spec/storage_config.rs @@ -0,0 +1,15 @@ +use node_runtime::{constants::currency, DataObjectBloatBond, StorageConfig}; + +pub fn production_config() -> StorageConfig { + StorageConfig { + data_object_per_mega_byte_fee: 5 * currency::MILLICENTS, + data_object_state_bloat_bond_value: DataObjectBloatBond::get(), + } +} + +pub fn testing_config() -> StorageConfig { + StorageConfig { + data_object_per_mega_byte_fee: 5 * currency::MILLICENTS, + data_object_state_bloat_bond_value: DataObjectBloatBond::get(), + } +} diff --git a/node/src/cli.rs b/bin/node/src/cli.rs similarity index 68% rename from node/src/cli.rs rename to bin/node/src/cli.rs index 0f6bf7d6ec..90df63fd68 100644 --- a/node/src/cli.rs +++ b/bin/node/src/cli.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 // This program is free software: you can redistribute it and/or modify @@ -16,52 +16,58 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use sc_cli::{KeySubcommand, RunCmd, SignCmd, VanityCmd, VerifyCmd}; -use structopt::StructOpt; - /// An overarching CLI command definition. -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Parser)] pub struct Cli { /// Possible subcommand with parameters. - #[structopt(subcommand)] + #[clap(subcommand)] pub subcommand: Option, + #[allow(missing_docs)] - #[structopt(flatten)] - pub run: RunCmd, + #[clap(flatten)] + pub run: sc_cli::RunCmd, + + /// Disable automatic hardware benchmarks. + /// + /// By default these benchmarks are automatically ran at startup and measure + /// the CPU speed, the memory bandwidth and the disk speed. + /// + /// The results are then printed out in the logs, and also sent as part of + /// telemetry, if telemetry is enabled. + #[clap(long)] + pub no_hardware_benchmarks: bool, } /// Possible subcommands of the main binary. -#[derive(Debug, StructOpt)] +#[derive(Debug, clap::Subcommand)] pub enum Subcommand { - /// Key management cli utilities - Key(KeySubcommand), - /// The custom inspect subcommmand for decoding blocks and extrinsics. - #[structopt( + #[clap( name = "inspect", about = "Decode given block or extrinsic using current native runtime." )] Inspect(node_inspect::cli::InspectCmd), - - /// The custom benchmark subcommmand benchmarking runtime pallets. - #[structopt(name = "benchmark", about = "Benchmark runtime pallets.")] + /// Sub-commands concerned with benchmarking. + /// The pallet benchmarking moved to the `pallet` sub-command. + #[clap(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), + /// Key management cli utilities + #[clap(subcommand)] + Key(sc_cli::KeySubcommand), + /// Verify a signature for a message, provided on STDIN, with a given (public or secret) key. - Verify(VerifyCmd), + Verify(sc_cli::VerifyCmd), /// Generate a seed that provides a vanity address. - Vanity(VanityCmd), + Vanity(sc_cli::VanityCmd), /// Sign a message, with a given (secret) key. - Sign(SignCmd), + Sign(sc_cli::SignCmd), /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), - /// Build a chain specification with a light client sync state. - BuildSyncSpec(sc_cli::BuildSyncSpecCmd), - /// Validate blocks. CheckBlock(sc_cli::CheckBlockCmd), @@ -79,4 +85,7 @@ pub enum Subcommand { /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), + + /// Db meta columns information. + ChainInfo(sc_cli::ChainInfoCmd), } diff --git a/bin/node/src/command.rs b/bin/node/src/command.rs new file mode 100644 index 0000000000..3660fb2243 --- /dev/null +++ b/bin/node/src/command.rs @@ -0,0 +1,235 @@ +// This file is part of Substrate. + +// Copyright (C) 2017-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use super::command_helper::{inherent_benchmark_data, BenchmarkExtrinsicBuilder}; +use crate::node_executor::ExecutorDispatch; +use crate::{ + chain_spec, + cli::Cli, + cli::Subcommand, + service, + service::{new_partial, FullClient}, +}; +use frame_benchmarking_cli::*; +use node_runtime::Block; +use node_runtime::RuntimeApi; + +use sc_cli::{ChainSpec, Result, RuntimeVersion, SubstrateCli}; +use sc_finality_grandpa as grandpa; +use sc_service::PartialComponents; +use sp_core::crypto::Ss58AddressFormat; +use std::sync::Arc; + +impl SubstrateCli for Cli { + fn impl_name() -> String { + "Joystream Node".into() + } + + fn impl_version() -> String { + env!("SUBSTRATE_CLI_IMPL_VERSION").into() + } + + fn description() -> String { + env!("CARGO_PKG_DESCRIPTION").into() + } + + fn author() -> String { + env!("CARGO_PKG_AUTHORS").into() + } + + fn support_url() -> String { + "https://www.joystream.org".into() + } + + fn copyright_start_year() -> i32 { + 2019 + } + + fn load_spec(&self, id: &str) -> std::result::Result, String> { + let spec = match id { + "" => { + return Err( + "Please specify which chain you want to run, e.g. --dev or --chain=local or --chain=prod-test" + .into(), + ) + } + "dev" => Box::new(chain_spec::development_config()), + "prod-test" => Box::new(chain_spec::prod_test_config()), + "local" => Box::new(chain_spec::local_testnet_config()), + path => Box::new(chain_spec::ChainSpec::from_json_file( + std::path::PathBuf::from(path), + )?), + }; + Ok(spec) + } + + fn native_runtime_version(_: &Box) -> &'static RuntimeVersion { + &node_runtime::VERSION + } +} + +/// Parse command line arguments into service configuration. +pub fn run() -> Result<()> { + let cli = Cli::from_args(); + + sp_core::crypto::set_default_ss58_version(Ss58AddressFormat::custom( + node_runtime::constants::JOY_ADDRESS_PREFIX, + )); + + match &cli.subcommand { + None => { + let runner = cli.create_runner(&cli.run)?; + runner.run_node_until_exit(|config| async move { + service::new_full(config, cli.no_hardware_benchmarks) + .map_err(sc_cli::Error::Service) + }) + } + Some(Subcommand::Inspect(cmd)) => { + let runner = cli.create_runner(cmd)?; + + runner.sync_run(|config| cmd.run::(config)) + } + Some(Subcommand::Benchmark(cmd)) => { + let runner = cli.create_runner(cmd)?; + + runner.sync_run(|config| { + // This switch needs to be in the client, since the client decides + // which sub-commands it wants to support. + match cmd { + BenchmarkCmd::Pallet(cmd) => { + if !cfg!(feature = "runtime-benchmarks") { + return Err( + "Runtime benchmarking wasn't enabled when building the node. \ + You can enable it with `--features runtime-benchmarks`." + .into(), + ); + } + + cmd.run::(config) + } + BenchmarkCmd::Block(cmd) => { + let PartialComponents { client, .. } = new_partial(&config)?; + cmd.run(client) + } + BenchmarkCmd::Storage(cmd) => { + let PartialComponents { + client, backend, .. + } = new_partial(&config)?; + let db = backend.expose_db(); + let storage = backend.expose_storage(); + + cmd.run(config, client, db, storage) + } + BenchmarkCmd::Overhead(cmd) => { + let PartialComponents { client, .. } = new_partial(&config)?; + let ext_builder = BenchmarkExtrinsicBuilder::new(client.clone()); + + cmd.run( + config, + client, + inherent_benchmark_data()?, + Arc::new(ext_builder), + ) + } + BenchmarkCmd::Machine(cmd) => { + cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()) + } + } + }) + } + Some(Subcommand::Key(cmd)) => cmd.run(&cli), + Some(Subcommand::Sign(cmd)) => cmd.run(), + Some(Subcommand::Verify(cmd)) => cmd.run(), + Some(Subcommand::Vanity(cmd)) => cmd.run(), + Some(Subcommand::BuildSpec(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) + } + Some(Subcommand::CheckBlock(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let PartialComponents { + client, + task_manager, + import_queue, + .. + } = new_partial(&config)?; + Ok((cmd.run(client, import_queue), task_manager)) + }) + } + Some(Subcommand::ExportBlocks(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let PartialComponents { + client, + task_manager, + .. + } = new_partial(&config)?; + Ok((cmd.run(client, config.database), task_manager)) + }) + } + Some(Subcommand::ExportState(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let PartialComponents { + client, + task_manager, + .. + } = new_partial(&config)?; + Ok((cmd.run(client, config.chain_spec), task_manager)) + }) + } + Some(Subcommand::ImportBlocks(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let PartialComponents { + client, + task_manager, + import_queue, + .. + } = new_partial(&config)?; + Ok((cmd.run(client, import_queue), task_manager)) + }) + } + Some(Subcommand::PurgeChain(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run(config.database)) + } + Some(Subcommand::Revert(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.async_run(|config| { + let PartialComponents { + client, + task_manager, + backend, + .. + } = new_partial(&config)?; + let aux_revert = Box::new(|client: Arc, backend, blocks| { + sc_consensus_babe::revert(client.clone(), backend, blocks)?; + grandpa::revert(client, blocks)?; + Ok(()) + }); + Ok((cmd.run(client, backend, Some(aux_revert)), task_manager)) + }) + } + Some(Subcommand::ChainInfo(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|config| cmd.run::(&config)) + } + } +} diff --git a/bin/node/src/command_helper.rs b/bin/node/src/command_helper.rs new file mode 100644 index 0000000000..0a73321849 --- /dev/null +++ b/bin/node/src/command_helper.rs @@ -0,0 +1,69 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Contains code to setup the command invocations in [`super::command`] which would +//! otherwise bloat that module. + +use crate::service::{create_extrinsic, FullClient}; + +use node_runtime::SystemCall; +use sc_cli::Result; +use sp_inherents::{InherentData, InherentDataProvider}; +use sp_keyring::Sr25519Keyring; +use sp_runtime::OpaqueExtrinsic; + +use std::{sync::Arc, time::Duration}; + +/// Generates extrinsics for the `benchmark overhead` command. +pub struct BenchmarkExtrinsicBuilder { + client: Arc, +} + +impl BenchmarkExtrinsicBuilder { + /// Creates a new [`Self`] from the given client. + pub fn new(client: Arc) -> Self { + Self { client } + } +} + +impl frame_benchmarking_cli::ExtrinsicBuilder for BenchmarkExtrinsicBuilder { + fn remark(&self, nonce: u32) -> std::result::Result { + let acc = Sr25519Keyring::Bob.pair(); + let extrinsic: OpaqueExtrinsic = create_extrinsic( + self.client.as_ref(), + acc, + SystemCall::remark { remark: vec![] }, + Some(nonce), + ) + .into(); + + Ok(extrinsic) + } +} + +/// Generates inherent data for the `benchmark overhead` command. +pub fn inherent_benchmark_data() -> Result { + let mut inherent_data = InherentData::new(); + let d = Duration::from_millis(0); + let timestamp = sp_timestamp::InherentDataProvider::new(d.into()); + + timestamp + .provide_inherent_data(&mut inherent_data) + .map_err(|e| format!("creating inherent data: {:?}", e))?; + Ok(inherent_data) +} diff --git a/bin/node/src/lib.rs b/bin/node/src/lib.rs new file mode 100644 index 0000000000..bd3ee119c2 --- /dev/null +++ b/bin/node/src/lib.rs @@ -0,0 +1,8 @@ +pub mod chain_spec; +mod cli; +pub mod command; +#[macro_use] +mod service; +mod command_helper; +mod node_executor; +mod node_rpc; diff --git a/bin/node/src/node_executor.rs b/bin/node/src/node_executor.rs new file mode 100644 index 0000000000..8dc759c172 --- /dev/null +++ b/bin/node/src/node_executor.rs @@ -0,0 +1,37 @@ +// This file is part of Substrate. + +// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! A `CodeExecutor` specialization which uses natively compiled runtime when the wasm to be +//! executed is equivalent to the natively compiled code. + +pub use sc_executor::NativeElseWasmExecutor; + +// Declare an instance of the native executor named `ExecutorDispatch`. Include the wasm binary as +// the equivalent wasm code. +pub struct ExecutorDispatch; + +impl sc_executor::NativeExecutionDispatch for ExecutorDispatch { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + + fn dispatch(method: &str, data: &[u8]) -> Option> { + node_runtime::api::dispatch(method, data) + } + + fn native_version() -> sc_executor::NativeVersion { + node_runtime::native_version() + } +} diff --git a/node/src/node_rpc.rs b/bin/node/src/node_rpc.rs similarity index 66% rename from node/src/node_rpc.rs rename to bin/node/src/node_rpc.rs index aaa1ce55a1..32427bbf51 100644 --- a/node/src/node_rpc.rs +++ b/bin/node/src/node_rpc.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// Copyright (C) 2019-2022 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,36 +30,25 @@ #![warn(missing_docs)] +use std::sync::Arc; + +use jsonrpsee::RpcModule; use node_runtime::{opaque::Block, AccountId, Balance, BlockNumber, Hash, Index}; +use sc_client_api::AuxStore; use sc_consensus_babe::{Config, Epoch}; -use sc_consensus_babe_rpc::BabeRpcHandler; use sc_consensus_epochs::SharedEpochChanges; use sc_finality_grandpa::{ FinalityProofProvider, GrandpaJustificationStream, SharedAuthoritySet, SharedVoterState, }; -use sc_finality_grandpa_rpc::GrandpaRpcHandler; -use sc_keystore::KeyStorePtr; use sc_rpc::SubscriptionTaskExecutor; pub use sc_rpc_api::DenyUnsafe; +use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; use sp_consensus::SelectChain; use sp_consensus_babe::BabeApi; -use sp_transaction_pool::TransactionPool; -use std::sync::Arc; - -/// Light client extra dependencies. -pub struct LightDeps { - /// The client instance to use. - pub client: Arc, - /// Transaction pool instance. - pub pool: Arc

, - /// Remote access to the blockchain (async). - pub remote_blockchain: Arc>, - /// Fetcher instance. - pub fetcher: Arc, -} +use sp_keystore::SyncCryptoStorePtr; /// Extra dependencies for BABE. pub struct BabeDeps { @@ -68,7 +57,7 @@ pub struct BabeDeps { /// BABE pending epoch changes. pub shared_epoch_changes: SharedEpochChanges, /// The keystore that manages the keys of the node. - pub keystore: KeyStorePtr, + pub keystore: SyncCryptoStorePtr, } /// Extra dependencies for GRANDPA @@ -93,6 +82,8 @@ pub struct FullDeps { pub pool: Arc

, /// The SelectChain Strategy pub select_chain: SC, + /// A copy of the chain spec. + pub chain_spec: Box, /// Whether to deny unsafe calls pub deny_unsafe: DenyUnsafe, /// BABE specific dependencies. @@ -101,17 +92,20 @@ pub struct FullDeps { pub grandpa: GrandpaDeps, } -/// A IO handler that uses all Full RPC extensions. -pub type IoHandler = jsonrpc_core::IoHandler; - /// Instantiate all Full RPC extensions. pub fn create_full( deps: FullDeps, -) -> jsonrpc_core::IoHandler + backend: Arc, +) -> Result, Box> where - C: ProvideRuntimeApi, - C: HeaderBackend + HeaderMetadata + 'static, - C: Send + Sync + 'static, + C: ProvideRuntimeApi + + sc_client_api::BlockBackend + + HeaderBackend + + AuxStore + + HeaderMetadata + + Sync + + Send + + 'static, C::Api: substrate_frame_rpc_system::AccountNonceApi, C::Api: pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi, C::Api: BabeApi, @@ -121,14 +115,20 @@ where B: sc_client_api::Backend + Send + Sync + 'static, B::State: sc_client_api::backend::StateBackend>, { - use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApi}; - use substrate_frame_rpc_system::{FullSystem, SystemApi}; - - let mut io = jsonrpc_core::IoHandler::default(); + use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; + use sc_consensus_babe_rpc::{Babe, BabeApiServer}; + use sc_finality_grandpa_rpc::{Grandpa, GrandpaApiServer}; + use sc_rpc::dev::{Dev, DevApiServer}; + use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; + use substrate_frame_rpc_system::{System, SystemApiServer}; + use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; + + let mut io = RpcModule::new(()); let FullDeps { client, pool, select_chain, + chain_spec, deny_unsafe, babe, grandpa, @@ -147,58 +147,45 @@ where finality_provider, } = grandpa; - io.extend_with(SystemApi::to_delegate(FullSystem::new( - client.clone(), - pool, - deny_unsafe, - ))); - io.extend_with(TransactionPaymentApi::to_delegate(TransactionPayment::new( - client.clone(), - ))); - io.extend_with(sc_consensus_babe_rpc::BabeApi::to_delegate( - BabeRpcHandler::new( - client, - shared_epoch_changes, + io.merge(System::new(client.clone(), pool, deny_unsafe).into_rpc())?; + // Making synchronous calls in light client freezes the browser currently, + // more context: https://github.com/paritytech/substrate/pull/3480 + // These RPCs should use an asynchronous caller instead. + io.merge(TransactionPayment::new(client.clone()).into_rpc())?; + io.merge( + Babe::new( + client.clone(), + shared_epoch_changes.clone(), keystore, babe_config, select_chain, deny_unsafe, - ), - )); - io.extend_with(sc_finality_grandpa_rpc::GrandpaApi::to_delegate( - GrandpaRpcHandler::new( - shared_authority_set, + ) + .into_rpc(), + )?; + io.merge( + Grandpa::new( + subscription_executor, + shared_authority_set.clone(), shared_voter_state, justification_stream, - subscription_executor, finality_provider, - ), - )); - - io -} - -/// Instantiate all Light RPC extensions. -pub fn create_light(deps: LightDeps) -> jsonrpc_core::IoHandler -where - C: sp_blockchain::HeaderBackend, - C: Send + Sync + 'static, - F: sc_client_api::light::Fetcher + 'static, - P: TransactionPool + 'static, - M: jsonrpc_core::Metadata + Default, -{ - use substrate_frame_rpc_system::{LightSystem, SystemApi}; + ) + .into_rpc(), + )?; + + io.merge( + SyncState::new( + chain_spec, + client.clone(), + shared_authority_set, + shared_epoch_changes, + )? + .into_rpc(), + )?; - let LightDeps { - client, - pool, - remote_blockchain, - fetcher, - } = deps; - let mut io = jsonrpc_core::IoHandler::default(); - io.extend_with(SystemApi::::to_delegate( - LightSystem::new(client, remote_blockchain, fetcher, pool), - )); + io.merge(StateMigration::new(client.clone(), backend, deny_unsafe).into_rpc())?; + io.merge(Dev::new(client, deny_unsafe).into_rpc())?; - io + Ok(io) } diff --git a/bin/node/src/service.rs b/bin/node/src/service.rs new file mode 100644 index 0000000000..059af570a9 --- /dev/null +++ b/bin/node/src/service.rs @@ -0,0 +1,874 @@ +// This file is part of Substrate. + +// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Service implementation. Specialized wrapper over substrate service. + +use crate::node_executor::ExecutorDispatch; +use codec::Encode; +use frame_system_rpc_runtime_api::AccountNonceApi; +use futures::prelude::*; +use node_runtime::opaque::Block; +use node_runtime::RuntimeApi; +use overrides::DEFAULT_HEAP_PAGES; +use sc_client_api::{BlockBackend, ExecutorProvider}; +use sc_consensus_babe::{self, SlotProportion}; +use sc_executor::NativeElseWasmExecutor; +use sc_finality_grandpa as grandpa; +use sc_network::{Event, NetworkService}; +use sc_service::{config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager}; +use sc_telemetry::{Telemetry, TelemetryWorker}; +use sp_api::ProvideRuntimeApi; +use sp_core::crypto::Pair; +use sp_runtime::{generic, traits::Block as BlockT, SaturatedConversion}; +use std::sync::Arc; + +/// The full client type definition. +pub type FullClient = + sc_service::TFullClient>; +type FullBackend = sc_service::TFullBackend; +type FullSelectChain = sc_consensus::LongestChain; +type FullGrandpaBlockImport = + grandpa::GrandpaBlockImport; + +/// The transaction pool type defintion. +pub type TransactionPool = sc_transaction_pool::FullPool; + +/// Fetch the nonce of the given `account` from the chain state. +/// +/// Note: Should only be used for tests. +pub fn fetch_nonce(client: &FullClient, account: sp_core::sr25519::Pair) -> u32 { + let best_hash = client.chain_info().best_hash; + client + .runtime_api() + .account_nonce(&generic::BlockId::Hash(best_hash), account.public().into()) + .expect("Fetching account nonce works; qed") +} + +/// Create a transaction using the given `call`. +/// +/// The transaction will be signed by `sender`. If `nonce` is `None` it will be fetched from the +/// state of the best block. +/// +/// Note: Should only be used for tests. +pub fn create_extrinsic( + client: &FullClient, + sender: sp_core::sr25519::Pair, + function: impl Into, + nonce: Option, +) -> node_runtime::UncheckedExtrinsic { + let function = function.into(); + let genesis_hash = client + .block_hash(0) + .ok() + .flatten() + .expect("Genesis block exists; qed"); + let best_hash = client.chain_info().best_hash; + let best_block = client.chain_info().best_number; + let nonce = nonce.unwrap_or_else(|| fetch_nonce(client, sender.clone())); + + let period = node_runtime::BlockHashCount::get() + .checked_next_power_of_two() + .map(|c| c / 2) + .unwrap_or(2) as u64; + let tip = 0; + let extra: node_runtime::SignedExtra = ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(generic::Era::mortal( + period, + best_block.saturated_into(), + )), + frame_system::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + ); + + let raw_payload = node_runtime::SignedPayload::from_raw( + function.clone(), + extra.clone(), + ( + (), + node_runtime::VERSION.spec_version, + node_runtime::VERSION.transaction_version, + genesis_hash, + best_hash, + (), + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|e| sender.sign(e)); + + node_runtime::UncheckedExtrinsic::new_signed( + function, + sp_runtime::AccountId32::from(sender.public()), + node_runtime::Signature::Sr25519(signature), + extra, + ) +} + +#[allow(clippy::type_complexity)] +/// Creates a new partial node. +pub fn new_partial( + config: &Configuration, +) -> Result< + sc_service::PartialComponents< + FullClient, + FullBackend, + FullSelectChain, + sc_consensus::DefaultImportQueue, + sc_transaction_pool::FullPool, + ( + impl Fn( + crate::node_rpc::DenyUnsafe, + sc_rpc::SubscriptionTaskExecutor, + ) -> Result, sc_service::Error>, + ( + sc_consensus_babe::BabeBlockImport, + grandpa::LinkHalf, + sc_consensus_babe::BabeLink, + ), + grandpa::SharedVoterState, + Option, + ), + >, + ServiceError, +> { + let telemetry = config + .telemetry_endpoints + .clone() + .filter(|x| !x.is_empty()) + .map(|endpoints| -> Result<_, sc_telemetry::Error> { + let worker = TelemetryWorker::new(16)?; + let telemetry = worker.handle().new_telemetry(endpoints); + Ok((worker, telemetry)) + }) + .transpose()?; + + let executor = NativeElseWasmExecutor::::new( + config.wasm_method, + Some(DEFAULT_HEAP_PAGES), + config.max_runtime_instances, + config.runtime_cache_size, + ); + + let (client, backend, keystore_container, task_manager) = + sc_service::new_full_parts::( + config, + telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), + executor, + )?; + let client = Arc::new(client); + + let telemetry = telemetry.map(|(worker, telemetry)| { + task_manager + .spawn_handle() + .spawn("telemetry", None, worker.run()); + telemetry + }); + + let select_chain = sc_consensus::LongestChain::new(backend.clone()); + + let transaction_pool = sc_transaction_pool::BasicPool::new_full( + config.transaction_pool.clone(), + config.role.is_authority().into(), + config.prometheus_registry(), + task_manager.spawn_essential_handle(), + client.clone(), + ); + + let (grandpa_block_import, grandpa_link) = grandpa::block_import( + client.clone(), + &(client.clone() as Arc<_>), + select_chain.clone(), + telemetry.as_ref().map(|x| x.handle()), + )?; + let justification_import = grandpa_block_import.clone(); + + let (block_import, babe_link) = sc_consensus_babe::block_import( + sc_consensus_babe::Config::get(&*client)?, + grandpa_block_import, + client.clone(), + )?; + + let slot_duration = babe_link.config().slot_duration(); + let import_queue = sc_consensus_babe::import_queue( + babe_link.clone(), + block_import.clone(), + Some(Box::new(justification_import)), + client.clone(), + select_chain.clone(), + move |_, ()| async move { + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + let uncles = + sp_authorship::InherentDataProvider::<::Header>::check_inherents(); + + Ok((timestamp, slot, uncles)) + }, + &task_manager.spawn_essential_handle(), + config.prometheus_registry(), + sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()), + telemetry.as_ref().map(|x| x.handle()), + )?; + + let import_setup = (block_import, grandpa_link, babe_link); + + let (rpc_extensions_builder, rpc_setup) = { + let (_, grandpa_link, babe_link) = &import_setup; + + let justification_stream = grandpa_link.justification_stream(); + let shared_authority_set = grandpa_link.shared_authority_set().clone(); + let shared_voter_state = grandpa::SharedVoterState::empty(); + let shared_voter_state2 = shared_voter_state.clone(); + + let finality_proof_provider = grandpa::FinalityProofProvider::new_for_service( + backend.clone(), + Some(shared_authority_set.clone()), + ); + + let babe_config = babe_link.config().clone(); + let shared_epoch_changes = babe_link.epoch_changes().clone(); + + let client = client.clone(); + let pool = transaction_pool.clone(); + let select_chain = select_chain.clone(); + let keystore = keystore_container.sync_keystore(); + let chain_spec = config.chain_spec.cloned_box(); + + let rpc_backend = backend.clone(); + let rpc_extensions_builder = move |deny_unsafe, subscription_executor| { + let deps = crate::node_rpc::FullDeps { + client: client.clone(), + pool: pool.clone(), + select_chain: select_chain.clone(), + chain_spec: chain_spec.cloned_box(), + deny_unsafe, + babe: crate::node_rpc::BabeDeps { + babe_config: babe_config.clone(), + shared_epoch_changes: shared_epoch_changes.clone(), + keystore: keystore.clone(), + }, + grandpa: crate::node_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + justification_stream: justification_stream.clone(), + subscription_executor, + finality_provider: finality_proof_provider.clone(), + }, + }; + + crate::node_rpc::create_full(deps, rpc_backend.clone()).map_err(Into::into) + }; + + (rpc_extensions_builder, shared_voter_state2) + }; + + Ok(sc_service::PartialComponents { + client, + backend, + task_manager, + keystore_container, + select_chain, + import_queue, + transaction_pool, + other: (rpc_extensions_builder, import_setup, rpc_setup, telemetry), + }) +} + +/// Result of [`new_full_base`]. +pub struct NewFullBase { + /// The task manager of the node. + pub task_manager: TaskManager, + /// The client instance of the node. + pub client: Arc, + /// The networking service of the node. + pub network: Arc::Hash>>, + /// The transaction pool of the node. + pub transaction_pool: Arc, + /// The rpc handlers of the node. + pub rpc_handlers: RpcHandlers, +} + +/// Creates a full service from the configuration. +pub fn new_full_base( + mut config: Configuration, + disable_hardware_benchmarks: bool, + with_startup_data: impl FnOnce( + &sc_consensus_babe::BabeBlockImport, + &sc_consensus_babe::BabeLink, + ), +) -> Result { + let hwbench = if !disable_hardware_benchmarks { + config.database.path().map(|database_path| { + let _ = std::fs::create_dir_all(&database_path); + sc_sysinfo::gather_hwbench(Some(database_path)) + }) + } else { + None + }; + + let sc_service::PartialComponents { + client, + backend, + mut task_manager, + import_queue, + keystore_container, + select_chain, + transaction_pool, + other: (rpc_builder, import_setup, rpc_setup, mut telemetry), + } = new_partial(&config)?; + + let shared_voter_state = rpc_setup; + let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; + let grandpa_protocol_name = grandpa::protocol_standard_name( + &client + .block_hash(0) + .ok() + .flatten() + .expect("Genesis block exists; qed"), + &config.chain_spec, + ); + + config + .network + .extra_sets + .push(grandpa::grandpa_peers_set_config( + grandpa_protocol_name.clone(), + )); + let warp_sync = Arc::new(grandpa::warp_proof::NetworkProvider::new( + backend.clone(), + import_setup.1.shared_authority_set().clone(), + Vec::default(), + )); + + let (network, system_rpc_tx, network_starter) = + sc_service::build_network(sc_service::BuildNetworkParams { + config: &config, + client: client.clone(), + transaction_pool: transaction_pool.clone(), + spawn_handle: task_manager.spawn_handle(), + import_queue, + block_announce_validator_builder: None, + warp_sync: Some(warp_sync), + })?; + + if config.offchain_worker.enabled { + sc_service::build_offchain_workers( + &config, + task_manager.spawn_handle(), + client.clone(), + network.clone(), + ); + } + + let role = config.role.clone(); + let force_authoring = config.force_authoring; + let backoff_authoring_blocks = + Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()); + let name = config.network.node_name.clone(); + let enable_grandpa = !config.disable_grandpa; + let prometheus_registry = config.prometheus_registry().cloned(); + + let rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { + config, + backend, + client: client.clone(), + keystore: keystore_container.sync_keystore(), + network: network.clone(), + rpc_builder: Box::new(rpc_builder), + transaction_pool: transaction_pool.clone(), + task_manager: &mut task_manager, + system_rpc_tx, + telemetry: telemetry.as_mut(), + })?; + + if let Some(hwbench) = hwbench { + sc_sysinfo::print_hwbench(&hwbench); + + if let Some(ref mut telemetry) = telemetry { + let telemetry_handle = telemetry.handle(); + task_manager.spawn_handle().spawn( + "telemetry_hwbench", + None, + sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), + ); + } + } + + let (block_import, grandpa_link, babe_link) = import_setup; + + (with_startup_data)(&block_import, &babe_link); + + if let sc_service::config::Role::Authority { .. } = &role { + let proposer = sc_basic_authorship::ProposerFactory::new( + task_manager.spawn_handle(), + client.clone(), + transaction_pool.clone(), + prometheus_registry.as_ref(), + telemetry.as_ref().map(|x| x.handle()), + ); + + let can_author_with = + sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); + + let client_clone = client.clone(); + let slot_duration = babe_link.config().slot_duration(); + let babe_config = sc_consensus_babe::BabeParams { + keystore: keystore_container.sync_keystore(), + client: client.clone(), + select_chain, + env: proposer, + block_import, + sync_oracle: network.clone(), + justification_sync_link: network.clone(), + create_inherent_data_providers: move |parent, ()| { + let client_clone = client_clone.clone(); + async move { + let uncles = sc_consensus_uncles::create_uncles_inherent_data_provider( + &*client_clone, + parent, + )?; + + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + // We Have not included transaction_storage pallet in runtime + // are they related? + let storage_proof = + sp_transaction_storage_proof::registration::new_data_provider( + &*client_clone, + &parent, + )?; + + Ok((timestamp, slot, uncles, storage_proof)) + } + }, + force_authoring, + backoff_authoring_blocks, + babe_link, + can_author_with, + block_proposal_slot_portion: SlotProportion::new(0.5), + max_block_proposal_slot_portion: None, + telemetry: telemetry.as_ref().map(|x| x.handle()), + }; + + let babe = sc_consensus_babe::start_babe(babe_config)?; + task_manager.spawn_essential_handle().spawn_blocking( + "babe-proposer", + Some("block-authoring"), + babe, + ); + } + + // Spawn authority discovery module. + if role.is_authority() { + let authority_discovery_role = + sc_authority_discovery::Role::PublishAndDiscover(keystore_container.keystore()); + let dht_event_stream = + network + .event_stream("authority-discovery") + .filter_map(|e| async move { + match e { + Event::Dht(e) => Some(e), + _ => None, + } + }); + let (authority_discovery_worker, _service) = + sc_authority_discovery::new_worker_and_service_with_config( + sc_authority_discovery::WorkerConfig { + publish_non_global_ips: auth_disc_publish_non_global_ips, + ..Default::default() + }, + client.clone(), + network.clone(), + Box::pin(dht_event_stream), + authority_discovery_role, + prometheus_registry.clone(), + ); + + task_manager.spawn_handle().spawn( + "authority-discovery-worker", + Some("networking"), + authority_discovery_worker.run(), + ); + } + + // if the node isn't actively participating in consensus then it doesn't + // need a keystore, regardless of which protocol we use below. + let keystore = if role.is_authority() { + Some(keystore_container.sync_keystore()) + } else { + None + }; + + let config = grandpa::Config { + // FIXME #1578 make this available through chainspec + gossip_duration: std::time::Duration::from_millis(333), + justification_period: 512, + name: Some(name), + observer_enabled: false, + keystore, + local_role: role, + telemetry: telemetry.as_ref().map(|x| x.handle()), + protocol_name: grandpa_protocol_name, + }; + + if enable_grandpa { + // start the full GRANDPA voter + // NOTE: non-authorities could run the GRANDPA observer protocol, but at + // this point the full voter should provide better guarantees of block + // and vote data availability than the observer. The observer has not + // been tested extensively yet and having most nodes in a network run it + // could lead to finality stalls. + let grandpa_config = grandpa::GrandpaParams { + config, + link: grandpa_link, + network: network.clone(), + telemetry: telemetry.as_ref().map(|x| x.handle()), + voting_rule: grandpa::VotingRulesBuilder::default().build(), + prometheus_registry, + shared_voter_state, + }; + + // the GRANDPA voter task is considered infallible, i.e. + // if it fails we take down the service with it. + task_manager.spawn_essential_handle().spawn_blocking( + "grandpa-voter", + None, + grandpa::run_grandpa_voter(grandpa_config)?, + ); + } + + network_starter.start_network(); + Ok(NewFullBase { + task_manager, + client, + network, + transaction_pool, + rpc_handlers, + }) +} + +/// Builds a new service for a full client. +pub fn new_full( + config: Configuration, + disable_hardware_benchmarks: bool, +) -> Result { + new_full_base(config, disable_hardware_benchmarks, |_, _| ()) + .map(|NewFullBase { task_manager, .. }| task_manager) +} + +#[cfg(test)] +mod tests { + use crate::service::{new_full_base, NewFullBase}; + use codec::Encode; + use node_runtime::{ + constants::{currency::CENTS, SLOT_DURATION}, + Address, BalancesCall, Call, UncheckedExtrinsic, + }; + use node_runtime::{opaque::Block, DigestItem, Signature}; + use sc_client_api::BlockBackend; + use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy}; + use sc_consensus_babe::{BabeIntermediate, CompatibleDigestItem, INTERMEDIATE_KEY}; + use sc_consensus_epochs::descendent_query; + use sc_keystore::LocalKeystore; + use sc_service_test::TestNetNode; + use sc_transaction_pool_api::{ChainEvent, MaintainedTransactionPool}; + use sp_consensus::{BlockOrigin, Environment, Proposer}; + use sp_core::{crypto::Pair as CryptoPair, Public}; + use sp_inherents::InherentDataProvider; + use sp_keyring::AccountKeyring; + use sp_keystore::{SyncCryptoStore, SyncCryptoStorePtr}; + use sp_runtime::{ + generic::{BlockId, Digest, Era, SignedPayload}, + key_types::BABE, + traits::{Block as BlockT, Header as HeaderT, IdentifyAccount, Verify}, + RuntimeAppPublic, + }; + + use std::convert::TryInto; + use std::{borrow::Cow, sync::Arc}; + + type AccountPublic = ::Signer; + + #[test] + // It is "ignored", but the node-cli ignored tests are running on the CI. + // This can be run locally with `cargo test --release -p node-cli test_sync -- --ignored`. + #[ignore] + fn test_sync() { + sp_tracing::try_init_simple(); + + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore: SyncCryptoStorePtr = + Arc::new(LocalKeystore::open(keystore_path.path(), None).expect("Creates keystore")); + let alice: sp_consensus_babe::AuthorityId = + SyncCryptoStore::sr25519_generate_new(&*keystore, BABE, Some("//Alice")) + .expect("Creates authority pair") + .into(); + + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); + + // For the block factory + let mut slot = 1u64; + + // For the extrinsics factory + let bob = Arc::new(AccountKeyring::Bob.pair()); + let charlie = Arc::new(AccountKeyring::Charlie.pair()); + let mut index = 0; + + sc_service_test::sync( + chain_spec, + |config| { + let mut setup_handles = None; + let NewFullBase { + task_manager, + client, + network, + transaction_pool, + .. + } = new_full_base( + config, + false, + |block_import: &sc_consensus_babe::BabeBlockImport, + babe_link: &sc_consensus_babe::BabeLink| { + setup_handles = Some((block_import.clone(), babe_link.clone())); + }, + )?; + + let node = sc_service_test::TestNetComponents::new( + task_manager, + client, + network, + transaction_pool, + ); + Ok((node, setup_handles.unwrap())) + }, + |service, &mut (ref mut block_import, ref babe_link)| { + let parent_id = BlockId::number(service.client().chain_info().best_number); + let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let parent_hash = parent_header.hash(); + let parent_number = *parent_header.number(); + + futures::executor::block_on(service.transaction_pool().maintain( + ChainEvent::NewBestBlock { + hash: parent_header.hash(), + tree_route: None, + }, + )); + + let mut proposer_factory = sc_basic_authorship::ProposerFactory::new( + service.spawn_handle(), + service.client(), + service.transaction_pool(), + None, + None, + ); + + let mut digest = Digest::default(); + + // even though there's only one authority some slots might be empty, + // so we must keep trying the next slots until we can claim one. + let (babe_pre_digest, epoch_descriptor) = loop { + let epoch_descriptor = babe_link + .epoch_changes() + .shared_data() + .epoch_descriptor_for_child_of( + descendent_query(&*service.client()), + &parent_hash, + parent_number, + slot.into(), + ) + .unwrap() + .unwrap(); + + let epoch = babe_link + .epoch_changes() + .shared_data() + .epoch_data(&epoch_descriptor, |slot| { + sc_consensus_babe::Epoch::genesis( + babe_link.config().genesis_config(), + slot, + ) + }) + .unwrap(); + + if let Some(babe_pre_digest) = + sc_consensus_babe::authorship::claim_slot(slot.into(), &epoch, &keystore) + .map(|(digest, _)| digest) + { + break (babe_pre_digest, epoch_descriptor); + } + + slot += 1; + }; + + let inherent_data = ( + sp_timestamp::InherentDataProvider::new( + std::time::Duration::from_millis(SLOT_DURATION * slot).into(), + ), + sp_consensus_babe::inherents::InherentDataProvider::new(slot.into()), + ) + .create_inherent_data() + .expect("Creates inherent data"); + + digest.push(::babe_pre_digest( + babe_pre_digest, + )); + + let new_block = futures::executor::block_on(async move { + let proposer = proposer_factory.init(&parent_header).await; + proposer + .unwrap() + .propose( + inherent_data, + digest, + std::time::Duration::from_secs(1), + None, + ) + .await + }) + .expect("Error making test block") + .block; + + let (new_header, new_body) = new_block.deconstruct(); + let pre_hash = new_header.hash(); + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = pre_hash.encode(); + let signature = SyncCryptoStore::sign_with( + &*keystore, + sp_consensus_babe::AuthorityId::ID, + &alice.to_public_crypto_pair(), + &to_sign, + ) + .unwrap() + .unwrap() + .try_into() + .unwrap(); + let item = ::babe_seal(signature); + slot += 1; + + let mut params = BlockImportParams::new(BlockOrigin::File, new_header); + params.post_digests.push(item); + params.body = Some(new_body); + params.intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate:: { epoch_descriptor }) as Box<_>, + ); + params.fork_choice = Some(ForkChoiceStrategy::LongestChain); + + futures::executor::block_on(block_import.import_block(params, Default::default())) + .expect("error importing test block"); + }, + |service, _| { + let amount = 5 * CENTS; + let to: Address = AccountPublic::from(bob.public()).into_account().into(); + let from: Address = AccountPublic::from(charlie.public()).into_account().into(); + let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); + let best_block_id = BlockId::number(service.client().chain_info().best_number); + let (spec_version, transaction_version) = { + let version = service.client().runtime_version_at(&best_block_id).unwrap(); + (version.spec_version, version.transaction_version) + }; + let signer = charlie.clone(); + + let function = Call::Balances(BalancesCall::transfer { + dest: to, + value: amount, + }); + + let check_non_zero_sender = frame_system::CheckNonZeroSender::new(); + let check_spec_version = frame_system::CheckSpecVersion::new(); + let check_tx_version = frame_system::CheckTxVersion::new(); + let check_genesis = frame_system::CheckGenesis::new(); + let check_era = frame_system::CheckEra::from(Era::Immortal); + let check_nonce = frame_system::CheckNonce::from(index); + let check_weight = frame_system::CheckWeight::new(); + let tx_payment = pallet_transaction_payment::ChargeTransactionPayment::from(0); + let extra = ( + check_non_zero_sender, + check_spec_version, + check_tx_version, + check_genesis, + check_era, + check_nonce, + check_weight, + tx_payment, + ); + let raw_payload = SignedPayload::from_raw( + function, + extra, + ( + (), + spec_version, + transaction_version, + genesis_hash, + genesis_hash, + (), + (), + (), + ), + ); + let signature = raw_payload.using_encoded(|payload| signer.sign(payload)); + let (function, extra, _) = raw_payload.deconstruct(); + index += 1; + UncheckedExtrinsic::new_signed(function, from, signature.into(), extra).into() + }, + ); + } + + #[test] + #[ignore] + fn test_consensus() { + sp_tracing::try_init_simple(); + + sc_service_test::consensus( + crate::chain_spec::tests::integration_test_config_with_two_authorities(), + |config| { + let NewFullBase { + task_manager, + client, + network, + transaction_pool, + .. + } = new_full_base(config, false, |_, _| ())?; + Ok(sc_service_test::TestNetComponents::new( + task_manager, + client, + network, + transaction_pool, + )) + }, + vec!["//Alice".into(), "//Bob".into()], + ) + } +} diff --git a/node/validator-node-banner.svg b/bin/node/validator-node-banner.svg similarity index 100% rename from node/validator-node-banner.svg rename to bin/node/validator-node-banner.svg diff --git a/bin/overrides/Cargo.toml b/bin/overrides/Cargo.toml new file mode 100644 index 0000000000..ccaceb5c8a --- /dev/null +++ b/bin/overrides/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "overrides" +version = "0.1.0" +authors = ['Joystream contributors'] +edition = "2018" \ No newline at end of file diff --git a/bin/overrides/src/lib.rs b/bin/overrides/src/lib.rs new file mode 100644 index 0000000000..f534cbb7b3 --- /dev/null +++ b/bin/overrides/src/lib.rs @@ -0,0 +1,4 @@ +//! Overrides of default Substrate values + +// 64 KiB * 16384 = 1 GiB +pub const DEFAULT_HEAP_PAGES: u64 = 16384; diff --git a/bin/utils/call-sizes/Cargo.toml b/bin/utils/call-sizes/Cargo.toml new file mode 100644 index 0000000000..0eeb30c8eb --- /dev/null +++ b/bin/utils/call-sizes/Cargo.toml @@ -0,0 +1,27 @@ +[package] +authors = ['Joystream contributors'] +# build = 'build.rs' +edition = '2018' +name = 'call-sizes' +version = '1.0.0' + +[dependencies] +# Runtime +joystream-node-runtime = { path = "../../../runtime" } +# Pallets +common = { package = 'pallet-common', default-features = false, path = '../../../runtime-modules/common'} +forum = { package = 'pallet-forum', default-features = false, path = '../../../runtime-modules/forum'} +membership = { package = 'pallet-membership', default-features = false, path = '../../../runtime-modules/membership'} +referendum = { package = 'pallet-referendum', default-features = false, path = '../../../runtime-modules/referendum'} +council = { package = 'pallet-council', default-features = false, path = '../../../runtime-modules/council'} +working-group = { package = 'pallet-working-group', default-features = false, path = '../../../runtime-modules/working-group'} +storage = { package = 'pallet-storage', default-features = false, path = '../../../runtime-modules/storage'} +proposals-engine = { package = 'pallet-proposals-engine', default-features = false, path = '../../../runtime-modules/proposals/engine'} +proposals-discussion = { package = 'pallet-proposals-discussion', default-features = false, path = '../../../runtime-modules/proposals/discussion'} +proposals-codex = { package = 'pallet-proposals-codex', default-features = false, path = '../../../runtime-modules/proposals/codex'} +pallet-constitution = { package = 'pallet-constitution', default-features = false, path = '../../../runtime-modules/constitution' } +staking-handler = { package = 'pallet-staking-handler', default-features = false, path = '../../../runtime-modules/staking-handler'} +bounty = { package = 'pallet-bounty', default-features = false, path = '../../../runtime-modules/bounty'} +content = { package = 'pallet-content', default-features = false, path = '../../../runtime-modules/content'} +joystream-utility = { package = 'pallet-utility', default-features = false, path = '../../../runtime-modules/utility'} +project-token = { package = 'pallet-project-token', default-features = false, path = '../../../runtime-modules/project-token'} diff --git a/bin/utils/call-sizes/src/main.rs b/bin/utils/call-sizes/src/main.rs new file mode 100644 index 0000000000..f2a244637b --- /dev/null +++ b/bin/utils/call-sizes/src/main.rs @@ -0,0 +1,71 @@ +use joystream_node_runtime::*; + +fn main() -> Result<(), String> { + println!( + "referendum: {}", + core::mem::size_of::>() + ); + + println!("forum: {}", core::mem::size_of::>()); + + println!( + "constitution: {}", + core::mem::size_of::>() + ); + + println!( + "joystream_utility: {}", + core::mem::size_of::>() + ); + + println!( + "project_token: {}", + core::mem::size_of::>() + ); + + println!("bounty: {}", core::mem::size_of::>()); + + println!( + "storage: {}", + core::mem::size_of::>() + ); + + println!( + "working_group: {}", + core::mem::size_of::>() + ); + + println!( + "membership: {}", + core::mem::size_of::>() + ); + + println!( + "proposals_engine: {}", + core::mem::size_of::>() + ); + + println!( + "proposals_codex: {}", + core::mem::size_of::>() + ); + + println!( + "proposals_discussion: {}", + core::mem::size_of::>() + ); + + println!( + "content: {}", + core::mem::size_of::>() + ); + + println!( + "council: {}", + core::mem::size_of::>() + ); + + println!("----\nRuntime: {}", core::mem::size_of::()); + + Ok(()) +} diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml new file mode 100644 index 0000000000..b631192c0f --- /dev/null +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -0,0 +1,20 @@ +[package] +authors = ['Joystream contributors'] +build = 'build.rs' +edition = '2018' +name = 'chain-spec-builder' +version = '8.0.0' + +[dependencies] +enum-utils = "0.1.2" +async-std = {version = "1.9.0", features = ["attributes"]} +futures-util = "0.3.15" +clap = { version = "3.1.18", features = ["derive"] } +rand = "0.8" +sc-keystore = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-telemetry = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-chain-spec = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-core = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-keystore = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +joystream-node = { path = "../../node" } +serde_json = "1.0.79" \ No newline at end of file diff --git a/utils/chain-spec-builder/build.rs b/bin/utils/chain-spec-builder/build.rs similarity index 100% rename from utils/chain-spec-builder/build.rs rename to bin/utils/chain-spec-builder/build.rs diff --git a/bin/utils/chain-spec-builder/src/main.rs b/bin/utils/chain-spec-builder/src/main.rs new file mode 100644 index 0000000000..b4fb2b6fb9 --- /dev/null +++ b/bin/utils/chain-spec-builder/src/main.rs @@ -0,0 +1,527 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use clap::Parser; +use rand::{distributions::Alphanumeric, rngs::OsRng, Rng}; + +use std::{ + fs, + path::{Path, PathBuf}, + sync::Arc, +}; + +use joystream_node::chain_spec::{ + self, content_config, initial_balances, joy_chain_spec_properties, project_token_config, + storage_config, AccountId, AuthorityDiscoveryId, BabeId, GrandpaId, ImOnlineId, + JOY_ADDRESS_PREFIX, +}; + +use sc_chain_spec::ChainType; +use sc_keystore::LocalKeystore; +use sc_telemetry::TelemetryEndpoints; +use sp_core::{ + crypto::{ByteArray, Ss58AddressFormat, Ss58Codec}, + sr25519, +}; +use sp_keystore::{SyncCryptoStore, SyncCryptoStorePtr}; + +const TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; + +#[allow(non_camel_case_types)] +#[derive(Debug, Clone, PartialEq, enum_utils::FromStr)] +enum ChainDeployment { + dev, + local, + staging, + live, +} + +#[allow(clippy::from_over_into)] +impl Into for ChainDeployment { + fn into(self) -> ChainType { + match self { + ChainDeployment::dev => ChainType::Development, + ChainDeployment::local => ChainType::Local, + ChainDeployment::staging => ChainType::Live, + ChainDeployment::live => ChainType::Live, + } + } +} + +/// A utility to easily create a testnet chain spec definition with a given set +/// of authorities and endowed accounts and/or generate random accounts. +#[derive(Parser)] +#[clap(rename_all = "kebab-case")] +enum ChainSpecBuilder { + /// Create a new chain spec with the given authority seeds, endowed and sudo + /// accounts. + New { + /// Authorities. Comma separated list. If list has single item it is + /// considered a seed. The stash,controller and session keys will be derived from this seed. + /// Otherwise the list should be ordered list of accounts: + /// stash,controller,grandpa,babe,im_online,authority_discovery + /// All the authories should be provided in same form, do not mix and match, seeds and accounts. + #[clap(long, short, required = true)] + authorities: Vec, + /// Active nominators (SS58 format), each backing a random subset of the aforementioned + /// authorities. Same account used as stash and controller. + #[clap(long, short)] + nominator_accounts: Vec, + /// Sudo account address (SS58 format). + #[clap(long, short)] + sudo_account: String, + /// The path where the chain spec should be saved. + #[clap(long, short, default_value = "./chain_spec.json")] + chain_spec_path: PathBuf, + /// Path to use when saving generated keystores for each authority. + /// + /// At this path, a new folder will be created for each authority's + /// keystore named `auth-$i` where `i` is the authority index, i.e. + /// `auth-0`, `auth-1`, etc. + /// Only used if seeds are provided for authorities. + #[clap(long, short)] + keystore_path: Option, + /// The path to an initial balances file + #[structopt(long)] + initial_balances_path: Option, + /// Deployment type: dev, local, staging, live + #[structopt(long, short, default_value = "live")] + deployment: String, + /// Endow authorities, nominators, and sudo account. Initial balances + /// overrides endowed amount. + #[structopt(long, short)] + fund_accounts: bool, + }, + /// Create a new chain spec with the given number of authorities and endowed + /// accounts. Random keys will be generated as required. + Generate { + /// The number of authorities. + #[clap(long, short)] + authorities: usize, + /// The number of nominators backing the aforementioned authorities. + /// + /// Will nominate a random subset of `authorities`. + #[clap(long, short, default_value = "0")] + nominators: usize, + /// The number of endowed accounts. + #[clap(long, short, default_value = "0")] + endowed: usize, + /// The path where the chain spec should be saved. + #[clap(long, short, default_value = "./chain_spec.json")] + chain_spec_path: PathBuf, + /// Path to use when saving generated keystores for each authority. + /// + /// At this path, a new folder will be created for each authority's + /// keystore named `auth-$i` where `i` is the authority index, i.e. + /// `auth-0`, `auth-1`, etc. + #[clap(long, short)] + keystore_path: Option, + /// The path to an initial balances file + #[clap(long)] + initial_balances_path: Option, + /// Deployment type: dev, local, staging, live + #[clap(long, short, default_value = "live")] + deployment: String, + }, +} + +impl ChainSpecBuilder { + /// Returns the path where the chain spec should be saved. + fn chain_spec_path(&self) -> &Path { + match self { + ChainSpecBuilder::New { + chain_spec_path, .. + } => chain_spec_path.as_path(), + ChainSpecBuilder::Generate { + chain_spec_path, .. + } => chain_spec_path.as_path(), + } + } + + /// Returns the path to load initial balances from + fn initial_balances_path(&self) -> &Option { + match self { + ChainSpecBuilder::New { + initial_balances_path, + .. + } => initial_balances_path, + ChainSpecBuilder::Generate { + initial_balances_path, + .. + } => initial_balances_path, + } + } + + /// Returns the chain deployment + fn chain_deployment(&self) -> ChainDeployment { + match self { + ChainSpecBuilder::New { deployment, .. } => deployment + .parse() + .expect("Failed to parse deployment argument"), + ChainSpecBuilder::Generate { deployment, .. } => deployment + .parse() + .expect("Failed to parse deployment argument"), + } + } + + /// Returns wether to fund accounts or not + fn fund_accounts(&self) -> bool { + match self { + // Authorities, Nominators, Sudo Key and endowed accounts by default + // will not be endowed, unless explicitly selected. + ChainSpecBuilder::New { fund_accounts, .. } => *fund_accounts, + // When generating new authorities, nominators, endowed account, + // and sudo_key we will always try to endow them. + ChainSpecBuilder::Generate { .. } => true, + } + } +} + +fn authorities_from_seeds( + seeds: &[String], +) -> Vec<( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, +)> { + seeds + .iter() + .map(AsRef::as_ref) + .map(chain_spec::authority_keys_from_seed) + .collect::>() +} + +#[allow(clippy::too_many_arguments)] +fn genesis_constructor( + deployment: &ChainDeployment, + authorities: Vec<( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, + )>, + nominator_accounts: &[AccountId], + endowed_accounts: &[AccountId], + sudo_account: &AccountId, + initial_balances_path: &Option, + fund_accounts: bool, +) -> chain_spec::GenesisConfig { + let genesis_balances = initial_balances_path + .as_ref() + .map(|path| initial_balances::balances_from_json(path.as_path())) + .unwrap_or_else(Vec::new); + + let vesting_accounts = initial_balances_path + .as_ref() + .map(|path| initial_balances::vesting_from_json(path.as_path())) + .unwrap_or_else(Vec::new); + + let content_cfg = match deployment { + ChainDeployment::live => content_config::production_config(), + _ => content_config::testing_config(), + }; + + let storage_cfg = match deployment { + ChainDeployment::live => storage_config::production_config(), + _ => storage_config::testing_config(), + }; + + let project_token_cfg = match deployment { + ChainDeployment::live => project_token_config::production_config(), + _ => project_token_config::testing_config(), + }; + + chain_spec::testnet_genesis( + fund_accounts, + authorities, + nominator_accounts.to_vec(), + sudo_account.clone(), + endowed_accounts.to_vec(), + genesis_balances, + vesting_accounts, + content_cfg, + storage_cfg, + project_token_cfg, + ) +} + +#[allow(clippy::too_many_arguments)] +fn generate_chain_spec( + deployment: ChainDeployment, + authorities: Vec, + nominator_accounts: Vec, + endowed_accounts: Vec, + sudo_account: String, + initial_balances_path: Option, + fund_accounts: bool, +) -> Result { + let parse_account = |address: String| { + AccountId::from_string(&address) + .map_err(|err| format!("Failed to parse account address: {:?} {:?}", address, err)) + }; + + let authorities = if authorities + .iter() + .map(|auth| auth.split(',').count()) + .all(|len| len == 1) + { + authorities_from_seeds(&authorities) + } else { + // assume accounts, panic if not as expected + authorities + .iter() + .map(|addresses| addresses.split(',').collect()) + .map(|addresses: Vec<&str>| { + if addresses.len() != 6 { + panic!("Wrong number of addresses provided for authority"); + } + ( + parse_account(addresses[0].into()).expect("failed to parse authority"), + parse_account(addresses[1].into()).expect("failed to parse authority"), + GrandpaId::from_string(addresses[2]).expect("failed to parse authority"), + BabeId::from_string(addresses[3]).expect("failed to parse authority"), + ImOnlineId::from_string(addresses[4]).expect("failed to parse authority"), + AuthorityDiscoveryId::from_string(addresses[5]) + .expect("failed to parse authority"), + ) + }) + .collect() + }; + + let nominator_accounts = nominator_accounts + .into_iter() + .map(parse_account) + .collect::, String>>()?; + + let endowed_accounts = endowed_accounts + .into_iter() + .map(parse_account) + .collect::, String>>()?; + + let sudo_account = parse_account(sudo_account)?; + + let telemetry_endpoints = Some( + TelemetryEndpoints::new(vec![(TELEMETRY_URL.to_string(), 0)]) + .expect("Staging telemetry url is valid; qed"), + ); + + let chain_spec = chain_spec::ChainSpec::from_genesis( + "Joystream Testnet", + "joy_testnet", + deployment.clone().into(), + move || { + genesis_constructor( + &deployment, + authorities.clone(), + &nominator_accounts, + &endowed_accounts, + &sudo_account, + &initial_balances_path, + fund_accounts, + ) + }, + vec![], + telemetry_endpoints, + Some(&*"/joy/testnet/0"), + None, // Some(&*"joy"), + Some(joy_chain_spec_properties()), + Default::default(), + ); + + chain_spec.as_json(false) +} + +fn generate_authority_keys_and_store(seeds: &[String], keystore_path: &Path) -> Result<(), String> { + for (n, seed) in seeds.iter().enumerate() { + let keystore: SyncCryptoStorePtr = Arc::new( + LocalKeystore::open(keystore_path.join(format!("auth-{}", n)), None) + .map_err(|err| err.to_string())?, + ); + + let (_, _, grandpa, babe, im_online, authority_discovery) = + chain_spec::authority_keys_from_seed(seed); + + let insert_key = |key_type, public| { + SyncCryptoStore::insert_unknown(&*keystore, key_type, seed, public) + .map_err(|_| format!("Failed to insert key: {:?}", key_type)) + }; + + insert_key(sp_core::crypto::key_types::BABE, babe.as_slice())?; + + insert_key(sp_core::crypto::key_types::GRANDPA, grandpa.as_slice())?; + + insert_key(sp_core::crypto::key_types::IM_ONLINE, im_online.as_slice())?; + + insert_key( + sp_core::crypto::key_types::AUTHORITY_DISCOVERY, + authority_discovery.as_slice(), + )?; + } + + Ok(()) +} + +fn print_seeds( + authority_seeds: &[String], + nominator_seeds: &[String], + endowed_seeds: &[String], + sudo_seed: &str, +) { + println!("# Authority seeds"); + + for (n, seed) in authority_seeds.iter().enumerate() { + println!("auth_{}={}", n, seed); + } + + println!(); + + if !nominator_seeds.is_empty() { + println!("# Nominator seeds"); + for (n, seed) in nominator_seeds.iter().enumerate() { + println!("nom_{}={}", n, seed); + } + } + + println!(); + + if !endowed_seeds.is_empty() { + println!("# Endowed seeds"); + for (n, seed) in endowed_seeds.iter().enumerate() { + println!("endowed_{}={}", n, seed); + } + + println!(); + } + + println!("# Sudo seed"); + println!("sudo={}", sudo_seed); + println!(); +} + +#[async_std::main] +async fn main() -> Result<(), String> { + #[cfg(build_type = "debug")] + println!( + "The chain spec builder builds a chain specification that includes a Joystream runtime compiled as WASM. To \ + ensure proper functioning of the included runtime compile (or run) the chain spec builder binary in \ + `--release` mode.\n", + ); + + sp_core::crypto::set_default_ss58_version(Ss58AddressFormat::custom(JOY_ADDRESS_PREFIX)); + + let builder = ChainSpecBuilder::from_args(); + let chain_spec_path = builder.chain_spec_path().to_path_buf(); + let initial_balances_path = builder.initial_balances_path().clone(); + let deployment = builder.chain_deployment(); + let fund_accounts = builder.fund_accounts(); + + let (authorities, nominator_accounts, endowed_accounts, sudo_account) = match builder { + ChainSpecBuilder::Generate { + authorities, + nominators, + endowed, + keystore_path, + .. + } => { + let authorities = authorities.max(1); + let rand_seed = || -> String { + let rand_str: String = OsRng + .sample_iter(&Alphanumeric) + .take(32) + .map(char::from) + .collect(); + format!("//{}", rand_str) + }; + + let authority_seeds = (0..authorities).map(|_| rand_seed()).collect::>(); + let nominator_seeds = (0..nominators).map(|_| rand_seed()).collect::>(); + let endowed_seeds = (0..endowed).map(|_| rand_seed()).collect::>(); + let sudo_seed = rand_seed(); + + print_seeds( + &authority_seeds, + &nominator_seeds, + &endowed_seeds, + &sudo_seed, + ); + + let sudo_account = + chain_spec::get_account_id_from_seed::(&sudo_seed).to_ss58check(); + + if let Some(keystore_path) = keystore_path { + generate_authority_keys_and_store(&authority_seeds, &keystore_path)?; + } + + let nominator_accounts = nominator_seeds + .into_iter() + .map(|seed| { + chain_spec::get_account_id_from_seed::(&seed).to_ss58check() + }) + .collect(); + + let endowed_accounts = endowed_seeds + .into_iter() + .map(|seed| { + chain_spec::get_account_id_from_seed::(&seed).to_ss58check() + }) + .collect(); + + ( + authority_seeds, + nominator_accounts, + endowed_accounts, + sudo_account, + ) + } + ChainSpecBuilder::New { + authorities, + nominator_accounts, + sudo_account, + keystore_path, + .. + } => { + if authorities + .iter() + .map(|auth| auth.split(',').count()) + .all(|len| len == 1) + { + // seeds + if let Some(keystore_path) = keystore_path { + generate_authority_keys_and_store(&authorities, &keystore_path)?; + } + } + + (authorities, nominator_accounts, vec![], sudo_account) + } + }; + + let json = generate_chain_spec( + deployment, + authorities, + nominator_accounts, + endowed_accounts, + sudo_account, + initial_balances_path, + fund_accounts, + )?; + + fs::write(chain_spec_path, json).map_err(|err| err.to_string()) +} diff --git a/bin/utils/session-keys/Cargo.toml b/bin/utils/session-keys/Cargo.toml new file mode 100644 index 0000000000..dfe68fc44b --- /dev/null +++ b/bin/utils/session-keys/Cargo.toml @@ -0,0 +1,19 @@ +[package] +authors = ['Joystream contributors'] +edition = '2018' +name = 'session-keys' +version = '1.0.0' + +[dependencies] +enum-utils = "0.1.2" +async-std = {version = "1.9.0", features = ["attributes"]} +futures-util = "0.3.15" +clap = { version = "3.1.18", features = ["derive"] } +rand = "0.8" +sc-keystore = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-telemetry = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sc-chain-spec = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-core = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +sp-keystore = { git = 'https://github.com/joystream/substrate.git', rev = 'd29a53b11c3e530d1656eef502cb0f1f8fff3522' } +joystream-node = { path = "../../node" } +serde_json = "1.0.79" \ No newline at end of file diff --git a/bin/utils/session-keys/src/main.rs b/bin/utils/session-keys/src/main.rs new file mode 100644 index 0000000000..da2840a187 --- /dev/null +++ b/bin/utils/session-keys/src/main.rs @@ -0,0 +1,191 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use clap::Parser; +use rand::{distributions::Alphanumeric, rngs::OsRng, Rng}; + +use std::{ + path::{Path, PathBuf}, + sync::Arc, +}; + +use joystream_node::chain_spec::{ + self, session_keys, AuthorityDiscoveryId, BabeId, GrandpaId, ImOnlineId, JOY_ADDRESS_PREFIX, +}; + +use sc_keystore::LocalKeystore; +use sp_core::crypto::{ByteArray, Ss58AddressFormat}; +use sp_keystore::{SyncCryptoStore, SyncCryptoStorePtr}; + +/// A utility to easily create session keys from a seed, generate +/// new keys from a random seed or inspect public keys in existing keystore. +#[derive(Parser)] +#[clap(rename_all = "kebab-case")] +enum SessionKeysUtil { + /// Create new session keys from a seed. + /// Public keys will be output on stdout. + FromSeed { + /// Authority key seed. + #[clap(long, short, required = true)] + seed: String, + /// The path where the keys should be saved. + #[clap(long, short, default_value = "./keystore")] + keystore_path: PathBuf, + }, + /// Generate new random session keys, seed will be output on stderr, + /// public keys will be output on stdout. + Generate { + /// The path where the keys should be saved. + #[clap(long, short, default_value = "./keystore")] + keystore_path: PathBuf, + }, + /// Inspect keys from keystore + Inspect { + /// The path where the keys are stored. + #[clap(long, short, default_value = "./keystore")] + keystore_path: PathBuf, + /// The output format, json or list (comma separatd list of the accoutns + /// in order grandpa,babe,im_online,authority_discovery) + #[clap(long, short, default_value = "list")] + output: String, + }, +} + +fn generate_session_keys_and_store(seed: &str, keystore_path: &Path) -> Result<(), String> { + // Do not add more than one set of keys in the same keystore + if keystore_path.is_dir() { + return Err("Keystore already exists".into()); + } + + let keystore: SyncCryptoStorePtr = + Arc::new(LocalKeystore::open(keystore_path, None).map_err(|err| err.to_string())?); + + let (_, _, grandpa, babe, im_online, authority_discovery) = + chain_spec::authority_keys_from_seed(seed); + + let insert_key = |key_type, public| { + SyncCryptoStore::insert_unknown(&*keystore, key_type, seed, public) + .map_err(|_| format!("Failed to insert key: {:?}", key_type)) + }; + + insert_key(sp_core::crypto::key_types::BABE, babe.as_slice())?; + + insert_key(sp_core::crypto::key_types::GRANDPA, grandpa.as_slice())?; + + insert_key(sp_core::crypto::key_types::IM_ONLINE, im_online.as_slice())?; + + insert_key( + sp_core::crypto::key_types::AUTHORITY_DISCOVERY, + authority_discovery.as_slice(), + )?; + + // print public keys to stdout + let keys = session_keys(grandpa, babe, im_online, authority_discovery); + let serialized = serde_json::to_string_pretty(&keys).map_err(|err| err.to_string())?; + println!("{}", serialized); + + Ok(()) +} + +fn inspect_keystore(keystore_path: &Path, output: String) -> Result<(), String> { + if !keystore_path.is_dir() { + return Err("Keystore does not exist".into()); + } + + let keystore: SyncCryptoStorePtr = + Arc::new(LocalKeystore::open(keystore_path, None).map_err(|err| err.to_string())?); + + let grandpa_keys = + SyncCryptoStore::keys(keystore.as_ref(), sp_core::crypto::key_types::GRANDPA) + .map_err(|err| err.to_string())?; + let babe_keys = SyncCryptoStore::keys(keystore.as_ref(), sp_core::crypto::key_types::BABE) + .map_err(|err| err.to_string())?; + let im_online_keys = + SyncCryptoStore::keys(keystore.as_ref(), sp_core::crypto::key_types::IM_ONLINE) + .map_err(|err| err.to_string())?; + let authority_discovery_keys = SyncCryptoStore::keys( + keystore.as_ref(), + sp_core::crypto::key_types::AUTHORITY_DISCOVERY, + ) + .map_err(|err| err.to_string())?; + + let grandpa = GrandpaId::from_slice(grandpa_keys[0].1.as_slice()) + .map_err(|_err| "failed to convert grandpa key")?; + + let babe = BabeId::from_slice(babe_keys[0].1.as_slice()) + .map_err(|_err| "failed to convert babe key")?; + + let im_online = ImOnlineId::from_slice(im_online_keys[0].1.as_slice()) + .map_err(|_err| "failed to convert im_online key")?; + + let authority_discovery = + AuthorityDiscoveryId::from_slice(authority_discovery_keys[0].1.as_slice()) + .map_err(|_err| "failed to convert authority_discovery key")?; + + let keys = session_keys(grandpa, babe, im_online, authority_discovery); + + if output == "json" { + let serialized = serde_json::to_string_pretty(&keys).map_err(|err| err.to_string())?; + println!("{}", serialized); + } else { + println!( + "{},{},{},{}", + keys.grandpa, keys.babe, keys.im_online, keys.authority_discovery + ); + } + + Ok(()) +} + +#[async_std::main] +async fn main() -> Result<(), String> { + sp_core::crypto::set_default_ss58_version(Ss58AddressFormat::custom(JOY_ADDRESS_PREFIX)); + + let sk = SessionKeysUtil::from_args(); + + match sk { + SessionKeysUtil::Generate { keystore_path, .. } => { + let rand_seed = || -> String { + let rand_str: String = OsRng + .sample_iter(&Alphanumeric) + .take(32) + .map(char::from) + .collect(); + format!("//{}", rand_str) + }; + + let seed = rand_seed(); + generate_session_keys_and_store(&seed, &keystore_path)?; + eprintln!("{}", seed); + } + SessionKeysUtil::FromSeed { + seed, + keystore_path, + .. + } => { + generate_session_keys_and_store(&seed, &keystore_path)?; + } + SessionKeysUtil::Inspect { + keystore_path, + output, + .. + } => { + inspect_keystore(&keystore_path, output)?; + } + }; + + Ok(()) +} diff --git a/build-node-docker.sh b/build-node-docker.sh index bab9262a82..7b58772e52 100755 --- a/build-node-docker.sh +++ b/build-node-docker.sh @@ -9,8 +9,8 @@ cd $SCRIPT_PATH source scripts/features.sh -CODE_HASH=`scripts/runtime-code-shasum.sh` -IMAGE=joystream/node:${CODE_HASH} +CODE_SHASUM=`scripts/runtime-code-shasum.sh` +IMAGE=joystream/node:${CODE_SHASUM} # Look for image locally if ! docker inspect ${IMAGE} > /dev/null; @@ -25,7 +25,9 @@ then echo "Building ${IMAGE}.." docker build . --file joystream-node.Dockerfile \ --tag ${IMAGE} \ - --build-arg CARGO_FEATURES=${FEATURES} + --build-arg CARGO_FEATURES=${FEATURES} \ + --build-arg GIT_COMMIT_HASH=$(git rev-parse --short=11 HEAD) \ + --build-arg CODE_SHASUM=${CODE_SHASUM} fi else echo "Found ${IMAGE} in local repo" diff --git a/chain-metadata.json b/chain-metadata.json index 9ac84508b6..c85757006c 100644 --- a/chain-metadata.json +++ b/chain-metadata.json @@ -1 +1 @@ -{"jsonrpc":"2.0","result":"0x6d6574610c9c1853797374656d011853797374656d401c4163636f756e7401010230543a3a4163636f756e744964944163636f756e74496e666f3c543a3a496e6465782c20543a3a4163636f756e74446174613e00210100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e7400000c753332040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b576569676874010064776569676874733a3a45787472696e7369637357656967687440000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e00000c753332040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b4861736801010538543a3a426c6f636b4e756d6265721c543a3a48617368008000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101050c7533321c5665633c75383e000400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d626572010038543a3a426c6f636b4e756d6265721000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801001c543a3a4861736880000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e3845787472696e73696373526f6f7401001c543a3a486173688000000000000000000000000000000000000000000000000000000000000000000415012045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e1844696765737401002c4469676573744f663c543e040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301008c5665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e040004a0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e284576656e74436f756e740100284576656e74496e646578100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101021c543a3a48617368845665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e000400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000584c61737452756e74696d6555706772616465496e666f04000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e74010010626f6f6c0400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000145068617365040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01282866696c6c5f626c6f636b04185f726174696f1c50657262696c6c040901204120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b041c5f72656d61726b1c5665633c75383e1c6c204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002c2023203c7765696768743e24202d20604f28312960e0202d2042617365205765696768743a20302e36363520c2b5732c20696e646570656e64656e74206f662072656d61726b206c656e6774682e50202d204e6f204442206f7065726174696f6e732e302023203c2f7765696768743e387365745f686561705f7061676573041470616765730c75363420fc2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e002c2023203c7765696768743e24202d20604f283129604c202d20312073746f726167652077726974652e64202d2042617365205765696768743a20312e34303520c2b57360202d203120777269746520746f20484541505f5041474553302023203c2f7765696768743e207365745f636f64650410636f64651c5665633c75383e28682053657420746865206e65772072756e74696d6520636f64652e002c2023203c7765696768743e3501202d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e7901202d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e6020776869636820697320657870656e73697665292e2c202d2031206576656e742e7d012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c792074686973206973207665727920657870656e736976652e902057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b730410636f64651c5665633c75383e201d012053657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002c2023203c7765696768743e90202d20604f2843296020776865726520604360206c656e677468206f662060636f64656088202d20312073746f726167652077726974652028636f64656320604f28432960292e2c202d2031206576656e742e75012054686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e302023203c2f7765696768743e5c7365745f6368616e6765735f747269655f636f6e666967044c6368616e6765735f747269655f636f6e666967804f7074696f6e3c4368616e67657354726965436f6e66696775726174696f6e3e28a02053657420746865206e6577206368616e676573207472696520636f6e66696775726174696f6e2e002c2023203c7765696768743e24202d20604f28312960b0202d20312073746f72616765207772697465206f722064656c6574652028636f64656320604f28312960292ed8202d20312063616c6c20746f20606465706f7369745f6c6f67603a20557365732060617070656e6460204150492c20736f204f28312964202d2042617365205765696768743a20372e32313820c2b57334202d204442205765696768743aa820202020202d205772697465733a204368616e67657320547269652c2053797374656d20446967657374302023203c2f7765696768743e2c7365745f73746f7261676504146974656d73345665633c4b657956616c75653e206c2053657420736f6d65206974656d73206f662073746f726167652e002c2023203c7765696768743e94202d20604f2849296020776865726520604960206c656e677468206f6620606974656d73607c202d206049602073746f72616765207772697465732028604f28312960292e74202d2042617365205765696768743a20302e353638202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e306b696c6c5f73746f7261676504106b657973205665633c4b65793e2078204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e002c2023203c7765696768743efc202d20604f28494b296020776865726520604960206c656e677468206f6620606b6579736020616e6420604b60206c656e677468206f66206f6e65206b657964202d206049602073746f726167652064656c6574696f6e732e70202d2042617365205765696768743a202e333738202a206920c2b57368202d205772697465733a204e756d626572206f66206974656d73302023203c2f7765696768743e2c6b696c6c5f70726566697808187072656669780c4b6579205f7375626b6579730c7533322c1501204b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e003d01202a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e64657241012074686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e002c2023203c7765696768743edc202d20604f285029602077686572652060506020616d6f756e74206f66206b65797320776974682070726566697820607072656669786064202d206050602073746f726167652064656c6574696f6e732e74202d2042617365205765696768743a20302e383334202a205020c2b57380202d205772697465733a204e756d626572206f66207375626b657973202b2031302023203c2f7765696768743e1c7375696369646500286501204b696c6c207468652073656e64696e67206163636f756e742c20617373756d696e6720746865726520617265206e6f207265666572656e636573206f75747374616e64696e6720616e642074686520636f6d706f7369746590206461746120697320657175616c20746f206974732064656661756c742076616c75652e002c2023203c7765696768743e24202d20604f283129607c202d20312073746f72616765207265616420616e642064656c6574696f6e2e54202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d5c2042617365205765696768743a20382e36323620c2b5731101204e6f2044422052656164206f72205772697465206f7065726174696f6e7320626563617573652063616c6c657220697320616c726561647920696e206f7665726c6179302023203c2f7765696768743e01144045787472696e7369635375636365737304304469737061746368496e666f04b820416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e205c5b696e666f5c5d3c45787472696e7369634661696c6564083444697370617463684572726f72304469737061746368496e666f049420416e2065787472696e736963206661696c65642e205c5b6572726f722c20696e666f5c5d2c436f64655570646174656400045420603a636f6465602077617320757064617465642e284e65774163636f756e7404244163636f756e744964047c2041206e6577205c5b6163636f756e745c5d2077617320637265617465642e344b696c6c65644163636f756e7404244163636f756e744964046c20416e205c5b6163636f756e745c5d20776173207265617065642e1838426c6f636b48617368436f756e7438543a3a426c6f636b4e756d62657210fa00000004d820546865206d6178696d756d206e756d626572206f6620626c6f636b7320746f20616c6c6f7720696e206d6f7274616c20657261732e484d6178696d756d426c6f636b576569676874185765696768742000204aa9d1010000047c20546865206d6178696d756d20776569676874206f66206120626c6f636b2e2044625765696768743c52756e74696d6544625765696768744040787d010000000000e1f505000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e50426c6f636b457865637574696f6e576569676874185765696768742000f2052a0100000004510120546865206261736520776569676874206f6620657865637574696e67206120626c6f636b2c20696e646570656e64656e74206f6620746865207472616e73616374696f6e7320696e2074686520626c6f636b2e4c45787472696e736963426173655765696768741857656967687420405973070000000004790120546865206261736520776569676874206f6620616e2045787472696e73696320696e2074686520626c6f636b2c20696e646570656e64656e74206f6620746865206f662065787472696e736963206265696e672065786563757465642e484d6178696d756d426c6f636b4c656e6774680c753332100000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e143c496e76616c6964537065634e616d6508150120546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e637265617365084501205468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d655420616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e0cf0204661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e000d01204569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f7369746504010120537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e740439012054686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e001c5574696c697479000108146261746368041463616c6c735c5665633c3c542061732054726169743e3a3a43616c6c3e50802053656e642061206261746368206f662064697370617463682063616c6c732e007c204d61792062652063616c6c65642066726f6d20616e79206f726967696e2e00f0202d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e006101204966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c820627970617373696e6720606672616d655f73797374656d3a3a54726169743a3a4261736543616c6c46696c74657260292e002c2023203c7765696768743e90202d2042617365207765696768743a2031342e3339202b202e393837202a206320c2b573b8202d20506c7573207468652073756d206f66207468652077656967687473206f6620746865206063616c6c73602ec4202d20506c7573206f6e65206164646974696f6e616c206576656e742e202872657065617420726561642f777269746529302023203c2f7765696768743e00590120546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e3501206576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e20746865590120604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d616465510120616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c657465646050206576656e74206973206465706f73697465642e3461735f646572697661746976650814696e6465780c7531361063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e34e02053656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e0059012046696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368c020757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e004901204e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e6501206265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e745501207468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31608020696e20746865204d756c74697369672070616c6c657420696e73746561642e00f8204e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0108404261746368496e746572727570746564080c7533323444697370617463684572726f72085901204261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c206173902077656c6c20617320746865206572726f722e205c5b696e6465782c206572726f725c5d384261746368436f6d706c657465640004cc204261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e00000110426162650110426162652c2845706f6368496e64657801000c75363420000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009c5665633c28417574686f7269747949642c2042616265417574686f72697479576569676874293e0400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f7401000c75363420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f7401000c75363420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e65737380000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e3c4e65787445706f6368436f6e6669670000504e657874436f6e66696744657363726970746f7204000498204e6578742065706f636820636f6e66696775726174696f6e2c206966206368616e6765642e384e65787452616e646f6d6e6573730100587363686e6f72726b656c3a3a52616e646f6d6e657373800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e305365676d656e74496e64657801000c7533321000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f4205765206d616b6520612074726164656f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101050c7533326c5665633c7363686e6f72726b656c3a3a52616e646f6d6e6573733e0004000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a656400003c4d6179626552616e646f6d6e65737304000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e204c6174656e657373010038543a3a426c6f636b4e756d626572100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e01084c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f667045717569766f636174696f6e50726f6f663c543a3a4865616465723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66200d01205265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c207665726966790901207468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66110120616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c34206265207265706f727465642e110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e00083445706f63684475726174696f6e0c753634206400000000000000080d0120546865206e756d626572206f66202a2a736c6f74732a2a207468617420616e2065706f63682074616b65732e20576520636f75706c652073657373696f6e7320746ffc2065706f6368732c20692e652e2077652073746172742061206e65772073657373696f6e206f6e636520746865206e65772065706f636820626567696e732e444578706563746564426c6f636b54696d6524543a3a4d6f6d656e7420701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e00022454696d657374616d70012454696d657374616d70080c4e6f77010024543a3a4d6f6d656e7420000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010010626f6f6c040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f01040c736574040c6e6f7748436f6d706163743c543a3a4d6f6d656e743e3c5820536574207468652063757272656e742074696d652e00590120546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed82070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e004501205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e74207370656369666965642062794420604d696e696d756d506572696f64602e00d820546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002c2023203c7765696768743ed0202d20604f285429602077686572652060546020636f6d706c6578697479206f6620606f6e5f74696d657374616d705f73657460a101202d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e20606f6e5f66696e616c697a656029b4202d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f7365746020604f285429602e302023203c2f7765696768743e0004344d696e696d756d506572696f6424543a3a4d6f6d656e7420b80b00000000000010690120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f64690120746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c79650120776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c6520746869737020706572696f64206f6e2064656661756c742073657474696e67732e000328417574686f72736869700128417574686f72736869700c18556e636c65730100e85665633c556e636c65456e7472794974656d3c543a3a426c6f636b4e756d6265722c20543a3a486173682c20543a3a4163636f756e7449643e3e0400041c20556e636c657318417574686f72000030543a3a4163636f756e7449640400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010010626f6f6c040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e0104287365745f756e636c657304286e65775f756e636c6573385665633c543a3a4865616465723e04642050726f76696465206120736574206f6620756e636c65732e00001c48496e76616c6964556e636c65506172656e74048c2054686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c7265616479536574048420556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c6573044420546f6f206d616e7920756e636c65732e3047656e65736973556e636c6504582054686520756e636c652069732067656e657369732e30546f6f48696768556e636c6504802054686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c75646564047c2054686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c6504b82054686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e042042616c616e636573012042616c616e6365731034546f74616c49737375616e6365010028543a3a42616c616e6365400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e7401010230543a3a4163636f756e7449645c4163636f756e74446174613c543a3a42616c616e63653e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6c205468652062616c616e6365206f6620616e206163636f756e742e004101204e4f54453a2054686973206973206f6e6c79207573656420696e20746865206361736520746861742074686973206d6f64756c65206973207573656420746f2073746f72652062616c616e6365732e144c6f636b7301010230543a3a4163636f756e744964705665633c42616c616e63654c6f636b3c543a3a42616c616e63653e3e00040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e3853746f7261676556657273696f6e01002052656c656173657304000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e0110207472616e736665720810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e6cd8205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e00090120607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e21012049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e1501204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b4206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e00190120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002c2023203c7765696768743e3101202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72cc202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e6901202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e004c2052656c617465642066756e6374696f6e733a0051012020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2d012020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365d420202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e61012020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e49012020202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616cf82020202020636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e88202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d4501202d2042617365205765696768743a2037332e363420c2b5732c20776f7273742063617365207363656e6172696f20286163636f756e7420637265617465642c206163636f756e742072656d6f76656429dc202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374696e6174696f6e206163636f756e741501202d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e302023203c2f7765696768743e2c7365745f62616c616e63650c0c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365206e65775f667265654c436f6d706163743c543a3a42616c616e63653e306e65775f72657365727665644c436f6d706163743c543a3a42616c616e63653e489420536574207468652062616c616e636573206f66206120676976656e206163636f756e742e00210120546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c090120616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e190120496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c01012069742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b420546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e002c2023203c7765696768743e80202d20496e646570656e64656e74206f662074686520617267756d656e74732ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e58202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3c202d2042617365205765696768743a6820202020202d204372656174696e673a2032372e353620c2b5736420202020202d204b696c6c696e673a2033352e313120c2b57398202d204442205765696768743a203120526561642c203120577269746520746f206077686f60302023203c2f7765696768743e38666f7263655f7472616e736665720c18736f757263658c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636510646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e1851012045786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d61792062652c207370656369666965642e2c2023203c7765696768743e4101202d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973902020206e6f7420617373756d656420746f20626520696e20746865206f7665726c61792e302023203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650810646573748c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c75654c436f6d706163743c543a3a42616c616e63653e2c51012053616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c2074686540206f726967696e206163636f756e742e00bc20393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c4205b607472616e73666572605d3a207374727563742e4d6f64756c652e68746d6c236d6574686f642e7472616e736665722c2023203c7765696768743ee8202d2043686561706572207468616e207472616e736665722062656361757365206163636f756e742063616e6e6f74206265206b696c6c65642e60202d2042617365205765696768743a2035312e3420c2b5731d01202d204442205765696768743a2031205265616420616e64203120577269746520746f2064657374202873656e64657220697320696e206f7665726c617920616c7265616479292c20233c2f7765696768743e01201c456e646f77656408244163636f756e7449641c42616c616e636504250120416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e205c5b6163636f756e742c20667265655f62616c616e63655c5d20447573744c6f737408244163636f756e7449641c42616c616e636508410120416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742cd020726573756c74696e6720696e20616e206f75747269676874206c6f73732e205c5b6163636f756e742c2062616c616e63655c5d205472616e736665720c244163636f756e744964244163636f756e7449641c42616c616e636504a0205472616e73666572207375636365656465642e205c5b66726f6d2c20746f2c2076616c75655c5d2842616c616e63655365740c244163636f756e7449641c42616c616e63651c42616c616e636504cc20412062616c616e6365207761732073657420627920726f6f742e205c5b77686f2c20667265652c2072657365727665645c5d1c4465706f73697408244163636f756e7449641c42616c616e636504210120536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e205c5b77686f2c206465706f7369745c5d20526573657276656408244163636f756e7449641c42616c616e636504210120536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e205c5b77686f2c2076616c75655c5d28556e726573657276656408244163636f756e7449641c42616c616e636504290120536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e205c5b77686f2c2076616c75655c5d4852657365727665526570617472696174656410244163636f756e744964244163636f756e7449641c42616c616e6365185374617475730c510120536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742edc2046696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652ea8205c5b66726f6d2c20746f2c2062616c616e63652c2064657374696e6174696f6e5f7374617475735c5d04484578697374656e7469616c4465706f73697428543a3a42616c616e6365400100000000000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e203856657374696e6742616c616e6365049c2056657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e7304c8204163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c204f766572666c6f77047420476f7420616e206f766572666c6f7720616674657220616464696e674c496e73756666696369656e7442616c616e636504782042616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f73697404ec2056616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650490205472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c6504cc20412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e74048c2042656e6566696369617279206163636f756e74206d757374207072652d657869737405485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100284d756c7469706c69657240000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01002052656c6561736573040000000008485472616e73616374696f6e427974654665653042616c616e63654f663c543e4000000000000000000000000000000000040d01205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e2c576569676874546f466565a45665633c576569676874546f466565436f656666696369656e743c42616c616e63654f663c543e3e3e0400040d012054686520706f6c796e6f6d69616c2074686174206973206170706c69656420696e206f7264657220746f20646572697665206665652066726f6d207765696768742e00061c5374616b696e67011c5374616b696e678c30486973746f7279446570746801000c75333210540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e7401000c753332100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e7401000c7533321000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100445665633c543a3a4163636f756e7449643e04000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e64656400010530543a3a4163636f756e74496430543a3a4163636f756e744964000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e184c656467657200010230543a3a4163636f756e744964a45374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e000400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010530543a3a4163636f756e7449647c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e00040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010530543a3a4163636f756e7449643856616c696461746f72507265667300040004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e284e6f6d696e61746f727300010530543a3a4163636f756e744964644e6f6d696e6174696f6e733c543a3a4163636f756e7449643e00040004650120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e2843757272656e74457261000020457261496e6465780400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e24416374697665457261000034416374697665457261496e666f040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e00b820546865206163746976652065726120697320746865206572612063757272656e746c792072657761726465642e2d012056616c696461746f7220736574206f66207468697320657261206d75737420626520657175616c20746f206053657373696f6e496e746572666163653a3a76616c696461746f7273602e5445726173537461727453657373696f6e496e64657800010520457261496e6465783053657373696f6e496e646578000400043101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e2c457261735374616b65727301020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401020520457261496e64657830543a3a4163636f756e744964904578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e050c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301020520457261496e64657830543a3a4163636f756e7449643856616c696461746f7250726566730504001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010520457261496e6465783042616c616e63654f663c543e0004000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e747301010520457261496e64657874457261526577617264506f696e74733c543a3a4163636f756e7449643e0014000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b6501010520457261496e6465783042616c616e63654f663c543e00400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f72636545726101001c466f7263696e6704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01001c50657262696c6c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401003042616c616e63654f663c543e40000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010520457261496e646578bc5665633c556e6170706c696564536c6173683c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e3e00040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100745665633c28457261496e6465782c2053657373696f6e496e646578293e04001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449645c2850657262696c6c2c2042616c616e63654f663c543e2905040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e45726100020520457261496e64657830543a3a4163636f756e7449643042616c616e63654f663c543e05040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e7300010530543a3a4163636f756e7449645c736c617368696e673a3a536c617368696e675370616e73000400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101058c28543a3a4163636f756e7449642c20736c617368696e673a3a5370616e496e6465782988736c617368696e673a3a5370616e5265636f72643c42616c616e63654f663c543e3e00800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000020457261496e646578040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e48536e617073686f7456616c696461746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f662076616c696461746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e48536e617073686f744e6f6d696e61746f72730000445665633c543a3a4163636f756e7449643e040008650120536e617073686f74206f66206e6f6d696e61746f72732061742074686520626567696e6e696e67206f66207468652063757272656e7420656c656374696f6e2077696e646f772e20546869732073686f756c64206f6e6c791901206861766520612076616c7565207768656e205b60457261456c656374696f6e537461747573605d203d3d2060456c656374696f6e5374617475733a3a4f70656e285f29602e34517565756564456c65637465640000a8456c656374696f6e526573756c743c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e04000c650120546865206e6578742076616c696461746f72207365742e2041742074686520656e64206f6620616e206572612c206966207468697320697320617661696c61626c652028706f74656e7469616c6c792066726f6d20746865610120726573756c74206f6620616e206f6666636861696e20776f726b6572292c20697420697320696d6d6564696174656c7920757365642e204f74686572776973652c20746865206f6e2d636861696e20656c656374696f6e342069732065786563757465642e2c51756575656453636f7265000034456c656374696f6e53636f7265040004b0205468652073636f7265206f66207468652063757272656e74205b60517565756564456c6563746564605d2e44457261456c656374696f6e537461747573010078456c656374696f6e5374617475733c543a3a426c6f636b4e756d6265723e040008490120466c616720746f20636f6e74726f6c2074686520657865637574696f6e206f6620746865206f6666636861696e20656c656374696f6e2e205768656e20604f70656e285f29602c207765206163636570746c20736f6c7574696f6e7320746f206265207375626d69747465642e54497343757272656e7453657373696f6e46696e616c010010626f6f6c0400084d012054727565206966207468652063757272656e74202a2a706c616e6e65642a2a2073657373696f6e2069732066696e616c2e204e6f74652074686174207468697320646f6573206e6f742074616b65206572615820666f7263696e6720696e746f206163636f756e742e3853746f7261676556657273696f6e01002052656c6561736573040310cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076332e302e3020666f72206e6577206e6574776f726b732e016010626f6e640c28636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651476616c756554436f6d706163743c42616c616e63654f663c543e3e1470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e5865012054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c8420626520746865206163636f756e74207468617420636f6e74726f6c732069742e003101206076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e00250120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e004020456d6974732060426f6e646564602e002c2023203c7765696768743ed4202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e20202d204f2831292e68202d20546872656520657874726120444220656e74726965732e005101204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e6564410120756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e4c202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d34205765696768743a204f2831292c204442205765696768743a3101202d20526561643a20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c2043757272656e74204572612c20486973746f72792044657074682c204c6f636b73e0202d2057726974653a20426f6e6465642c2050617965652c205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e28626f6e645f657874726104386d61785f6164646974696f6e616c54436f6d706163743c42616c616e63654f663c543e3e5465012041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e63652075703420666f72207374616b696e672e00510120557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e650120556e6c696b65205b60626f6e64605d206f72205b60756e626f6e64605d20746869732066756e6374696f6e20646f6573206e6f7420696d706f736520616e79206c696d69746174696f6e206f6e2074686520616d6f756e744c20746861742063616e2062652061646465642e00610120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c657220616e64f82069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004020456d6974732060426f6e646564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e20202d204f2831292e40202d204f6e6520444220656e7472792e34202d2d2d2d2d2d2d2d2d2d2d2d2c204442205765696768743a1501202d20526561643a2045726120456c656374696f6e205374617475732c20426f6e6465642c204c65646765722c205b4f726967696e204163636f756e745d2c204c6f636b73a4202d2057726974653a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e18756e626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e805501205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64010120706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e250120543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e004901204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665c0207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e003d01204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360293d012063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564fc20746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004820456d6974732060556e626f6e646564602e00982053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e002c2023203c7765696768743e4101202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e6501202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e63656029710120202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e5101202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c6564207669615c2020206077697468647261775f756e626f6e646564602e40202d204f6e6520444220656e7472792e2c202d2d2d2d2d2d2d2d2d2d34205765696768743a204f2831292c204442205765696768743a1d01202d20526561643a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e744572612c204c6f636b732c2042616c616e63654f662053746173682ca4202d2057726974653a204c6f636b732c204c65646765722c2042616c616e63654f662053746173682c28203c2f7765696768743e4477697468647261775f756e626f6e64656404486e756d5f736c617368696e675f7370616e730c7533327c2d012052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e003501205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4c2077686174657665722069742077616e74732e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e004c20456d697473206057697468647261776e602e006c2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002c2023203c7765696768743e5501202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e45012020497420696d706c6965732060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c207768696368206973f42020696e6469726563746c7920757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e7901202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d090120436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766520205570646174653a2501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c204c6f636b732c205b4f726967696e204163636f756e745da8202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c656467657218204b696c6c3a4501202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c2043757272656e74204572612c20426f6e6465642c20536c617368696e67205370616e732c205b4f726967696e8c2020204163636f756e745d2c204c6f636b732c2042616c616e63654f662073746173685101202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732cb02020205b4f726967696e204163636f756e745d2c204c6f636b732c2042616c616e63654f662073746173682e74202d2057726974657320456163683a205370616e536c617368202a20530d01204e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e302023203c2f7765696768743e2076616c6964617465041470726566733856616c696461746f72507265667344e8204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e30202d2d2d2d2d2d2d2d2d2d2d34205765696768743a204f2831292c204442205765696768743a90202d20526561643a2045726120456c656374696f6e205374617475732c204c656467657280202d2057726974653a204e6f6d696e61746f72732c2056616c696461746f7273302023203c2f7765696768743e206e6f6d696e617465041c74617267657473a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e4c1101204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00510120456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546869732063616e206f6e6c792062652063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e3101202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e2901012077686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d495420284d41585f4e4f4d494e4154494f4e53292ed8202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e28202d2d2d2d2d2d2d2d2d34205765696768743a204f284e2984207768657265204e20697320746865206e756d626572206f6620746172676574732c204442205765696768743ac8202d2052656164733a2045726120456c656374696f6e205374617475732c204c65646765722c2043757272656e742045726184202d205772697465733a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e146368696c6c0044c8204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0d0120416e642c2069742063616e206265206f6e6c792063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e54202d20436f6e7461696e73206f6e6520726561642ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e24202d2d2d2d2d2d2d2d34205765696768743a204f2831292c204442205765696768743a88202d20526561643a20457261456c656374696f6e5374617475732c204c656467657280202d2057726974653a2056616c696461746f72732c204e6f6d696e61746f7273302023203c2f7765696768743e247365745f7061796565041470617965657c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e40b8202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e28202d2d2d2d2d2d2d2d2d3c202d205765696768743a204f28312934202d204442205765696768743a4c20202020202d20526561643a204c65646765724c20202020202d2057726974653a205061796565302023203c2f7765696768743e387365745f636f6e74726f6c6c65720428636f6e74726f6c6c65728c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263654090202852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e00dc20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e00550120546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002c2023203c7765696768743ee8202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e98202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec8202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c202d2d2d2d2d2d2d2d2d2d34205765696768743a204f2831292c204442205765696768743af4202d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f8202d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572302023203c2f7765696768743e4c7365745f76616c696461746f725f636f756e74040c6e657730436f6d706163743c7533323e209420536574732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e34205765696768743a204f2831295c2057726974653a2056616c696461746f7220436f756e74302023203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e7404286164646974696f6e616c30436f6d706163743c7533323e1cac20496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e842053616d65206173205b607365745f76616c696461746f725f636f756e74605d2e302023203c2f7765696768743e547363616c655f76616c696461746f725f636f756e740418666163746f721c50657263656e741cd4205363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e842053616d65206173205b607365745f76616c696461746f725f636f756e74605d2e302023203c2f7765696768743e34666f7263655f6e6f5f657261730024b020466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e3c202d205765696768743a204f28312948202d2057726974653a20466f726365457261302023203c2f7765696768743e34666f7263655f6e65775f65726100284d0120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c206265a020726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e40202d204e6f20617267756d656e74732e3c202d205765696768743a204f28312944202d20577269746520466f726365457261302023203c2f7765696768743e447365745f696e76756c6e657261626c65730434696e76756c6e657261626c6573445665633c543a3a4163636f756e7449643e20cc20536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e1c202d204f2856295c202d2057726974653a20496e76756c6e657261626c6573302023203c2f7765696768743e34666f7263655f756e7374616b650814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c753332280d0120466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743eec204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2062652072656d6f766564b82052656164733a20426f6e6465642c20536c617368696e67205370616e732c204163636f756e742c204c6f636b738501205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c204163636f756e742c204c6f636b736c2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e50666f7263655f6e65775f6572615f616c776179730020050120466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e008820546865206469737061746368206f726967696e206d75737420626520526f6f742e002c2023203c7765696768743e3c202d205765696768743a204f28312948202d2057726974653a20466f726365457261302023203c2f7765696768743e5463616e63656c5f64656665727265645f736c617368080c65726120457261496e64657834736c6173685f696e6469636573205665633c7533323e34982043616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b42043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e00050120506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e002c2023203c7765696768743e5420436f6d706c65786974793a204f2855202b205329b82077697468205520756e6170706c69656420736c6173686573207765696768746564207769746820553d31303030d420616e64205320697320746865206e756d626572206f6620736c61736820696e646963657320746f2062652063616e63656c65642e68202d20526561643a20556e6170706c69656420536c61736865736c202d2057726974653a20556e6170706c69656420536c6173686573302023203c2f7765696768743e387061796f75745f7374616b657273083c76616c696461746f725f737461736830543a3a4163636f756e7449640c65726120457261496e64657870110120506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e004d01202d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f290120202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e3501202d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e00590120546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e20696678206974206973206e6f74206f6e65206f6620746865207374616b6572732e00010120546869732063616e206f6e6c792062652063616c6c6564207768656e205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743e0101202d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec4202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e30202d2d2d2d2d2d2d2d2d2d2d1d01204e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f722920205765696768743a88202d205265776172642044657374696e6174696f6e205374616b65643a204f284e29c4202d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a204f284e292c204442205765696768743a2901202d20526561643a20457261456c656374696f6e5374617475732c2043757272656e744572612c20486973746f727944657074682c204572617356616c696461746f725265776172642c2d01202020202020202020457261735374616b657273436c69707065642c2045726173526577617264506f696e74732c204572617356616c696461746f725072656673202838206974656d73291101202d205265616420456163683a20426f6e6465642c204c65646765722c2050617965652c204c6f636b732c2053797374656d204163636f756e74202835206974656d7329d8202d20577269746520456163683a2053797374656d204163636f756e742c204c6f636b732c204c6564676572202833206974656d73290051012020204e4f54453a20776569676874732061726520617373756d696e672074686174207061796f75747320617265206d61646520746f20616c697665207374617368206163636f756e7420285374616b6564292e5901202020506179696e67206576656e2061206465616420636f6e74726f6c6c65722069732063686561706572207765696768742d776973652e20576520646f6e277420646f20616e7920726566756e647320686572652e302023203c2f7765696768743e187265626f6e64041476616c756554436f6d706163743c42616c616e63654f663c543e3e38e0205265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00550120546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722c20616e642069742063616e206265206f6e6c792063616c6c6564207768656e8c205b60457261456c656374696f6e537461747573605d2069732060436c6f736564602e002c2023203c7765696768743ed4202d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b7394202d20426f756e64656420627920604d41585f554e4c4f434b494e475f4348554e4b53602ef4202d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e40202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d34202d204442205765696768743a010120202020202d2052656164733a20457261456c656374696f6e5374617475732c204c65646765722c204c6f636b732c205b4f726967696e204163636f756e745db820202020202d205772697465733a205b4f726967696e204163636f756e745d2c204c6f636b732c204c6564676572302023203c2f7765696768743e447365745f686973746f72795f646570746808446e65775f686973746f72795f646570746844436f6d706163743c457261496e6465783e485f6572615f6974656d735f64656c6574656430436f6d706163743c7533323e543101205365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e80207768656e2060486973746f727944657074686020697320726564756365642e003020506172616d65746572733a1101202d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e4901202d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e450120202020546869732073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c6445012020202065726120686973746f72792e204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e2054727573746564206279a02020202060526f6f746020746f207265706f727420616e206163637572617465206e756d6265722e0054204f726967696e206d75737420626520726f6f742e002c2023203c7765696768743ee0202d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d20333c202d205765696768743a204f28452934202d204442205765696768743aa020202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074687020202020202d205772697465733a20486973746f7279204465707468310120202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f725072656673810120202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c2045726173537461727453657373696f6e496e646578302023203c2f7765696768743e28726561705f73746173680814737461736830543a3a4163636f756e744964486e756d5f736c617368696e675f7370616e730c7533323c39012052656d6f766520616c6c20646174612073747275637475726520636f6e6365726e696e672061207374616b65722f7374617368206f6e6365206974732062616c616e6365206973207a65726f2e6101205468697320697320657373656e7469616c6c79206571756976616c656e7420746f206077697468647261775f756e626f6e64656460206578636570742069742063616e2062652063616c6c656420627920616e796f6e65c020616e6420746865207461726765742060737461736860206d7573742068617665206e6f2066756e6473206c6566742e009020546869732063616e2062652063616c6c65642066726f6d20616e79206f726967696e2e000101202d20607374617368603a20546865207374617368206163636f756e7420746f20726561702e204974732062616c616e6365206d757374206265207a65726f2e002c2023203c7765696768743e250120436f6d706c65786974793a204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e73206f6e20746865206163636f756e742e2c204442205765696768743ad8202d2052656164733a205374617368204163636f756e742c20426f6e6465642c20536c617368696e67205370616e732c204c6f636b73a501202d205772697465733a20426f6e6465642c20536c617368696e67205370616e73202869662053203e2030292c204c65646765722c2050617965652c2056616c696461746f72732c204e6f6d696e61746f72732c205374617368204163636f756e742c204c6f636b7374202d2057726974657320456163683a205370616e536c617368202a2053302023203c2f7765696768743e607375626d69745f656c656374696f6e5f736f6c7574696f6e141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a65c4e4205375626d697420616e20656c656374696f6e20726573756c7420746f2074686520636861696e2e2049662074686520736f6c7574696f6e3a003420312e2069732076616c69642e150120322e206861732061206265747465722073636f7265207468616e206120706f74656e7469616c6c79206578697374696e6720736f6c7574696f6e206f6e20636861696e2e0084207468656e2c2069742077696c6c206265205f7075745f206f6e20636861696e2e00ac204120736f6c7574696f6e20636f6e7369737473206f662074776f20706965636573206f6620646174613a00f420312e206077696e6e657273603a206120666c617420766563746f72206f6620616c6c207468652077696e6e657273206f662074686520726f756e642e510120322e206061737369676e6d656e7473603a2074686520636f6d706163742076657273696f6e206f6620616e2061737369676e6d656e7420766563746f72207468617420656e636f6465732074686520656467653020202020776569676874732e00210120426f7468206f66207768696368206d617920626520636f6d7075746564207573696e67205f70687261676d656e5f2c206f7220616e79206f7468657220616c676f726974686d2e00a8204164646974696f6e616c6c792c20746865207375626d6974746572206d7573742070726f766964653a00c8202d20546865206073636f7265602074686174207468657920636c61696d20746865697220736f6c7574696f6e206861732e004d0120426f74682076616c696461746f727320616e64206e6f6d696e61746f72732077696c6c20626520726570726573656e74656420627920696e646963657320696e2074686520736f6c7574696f6e2e205468651d0120696e64696365732073686f756c6420726573706563742074686520636f72726573706f6e64696e6720747970657320285b6056616c696461746f72496e646578605d20616e643101205b604e6f6d696e61746f72496e646578605d292e204d6f72656f7665722c20746865792073686f756c642062652076616c6964207768656e207573656420746f20696e64657820696e746f5101205b60536e617073686f7456616c696461746f7273605d20616e64205b60536e617073686f744e6f6d696e61746f7273605d2e20416e7920696e76616c696420696e6465782077696c6c20636175736520746865610120736f6c7574696f6e20746f2062652072656a65637465642e2054686573652074776f2073746f72616765206974656d73206172652073657420647572696e672074686520656c656374696f6e2077696e646f7720616e6498206d6179206265207573656420746f2064657465726d696e652074686520696e64696365732e0060204120736f6c7574696f6e2069732076616c69642069663a00e420302e204974206973207375626d6974746564207768656e205b60457261456c656374696f6e537461747573605d20697320604f70656e602ef820312e2049747320636c61696d65642073636f726520697320657175616c20746f207468652073636f726520636f6d7075746564206f6e2d636861696e2eac20322e2050726573656e74732074686520636f7272656374206e756d626572206f662077696e6e6572732e550120332e20416c6c20696e6465786573206d7573742062652076616c7565206163636f7264696e6720746f2074686520736e617073686f7420766563746f72732e20416c6c20656467652076616c756573206d7573745d0120202020616c736f20626520636f727265637420616e642073686f756c64206e6f74206f766572666c6f7720746865206772616e756c6172697479206f662074686520726174696f20747970652028692e652e2032353640202020206f722062696c6c696f6e292e0d0120342e20466f72206561636820656467652c20616c6c2074617267657473206172652061637475616c6c79206e6f6d696e617465642062792074686520766f7465722e6c20352e2048617320636f72726563742073656c662d766f7465732e00c0204120736f6c7574696f6e732073636f726520697320636f6e736973746564206f66203320706172616d65746572733a00650120312e20606d696e207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d6178696d697a65642e650120322e206073756d207b20737570706f72742e746f74616c207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c64206265206d696e696d697a65642e410120332e206073756d207b20737570706f72742e746f74616c5e32207d6020666f72206561636820737570706f7274206f6620612077696e6e65722e20546869732076616c75652073686f756c642062659c202020206d696e696d697a65642028746f20656e73757265206c6573732076617269616e636529002c2023203c7765696768743e190120546865207472616e73616374696f6e20697320617373756d656420746f20626520746865206c6f6e6765737420706174682c20612062657474657220736f6c7574696f6e2ea42020202d20496e697469616c20736f6c7574696f6e20697320616c6d6f7374207468652073616d652e45012020202d20576f72736520736f6c7574696f6e20697320726574726163656420696e207072652d64697370617463682d636865636b73207768696368207365747320697473206f776e207765696768742e302023203c2f7765696768743e847375626d69745f656c656374696f6e5f736f6c7574696f6e5f756e7369676e6564141c77696e6e6572734c5665633c56616c696461746f72496e6465783e1c636f6d7061637448436f6d7061637441737369676e6d656e74731473636f726534456c656374696f6e53636f72650c65726120457261496e6465781073697a6530456c656374696f6e53697a6524c020556e7369676e65642076657273696f6e206f6620607375626d69745f656c656374696f6e5f736f6c7574696f6e602e005d01204e6f746520746861742074686973206d757374207061737320746865205b6056616c6964617465556e7369676e6564605d20636865636b207768696368206f6e6c7920616c6c6f7773207472616e73616374696f6e7361012066726f6d20746865206c6f63616c206e6f646520746f20626520696e636c756465642e20496e206f7468657220776f7264732c206f6e6c792074686520626c6f636b20617574686f722063616e20696e636c756465206168207472616e73616374696f6e20696e2074686520626c6f636b2e002c2023203c7765696768743e7020536565206063726174653a3a77656967687460206d6f64756c652e302023203c2f7765696768743e0124244572615061796f75740c20457261496e6465781c42616c616e63651c42616c616e63650c59012054686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c4207468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642eac205c5b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725c5d1852657761726408244163636f756e7449641c42616c616e636504fc20546865207374616b657220686173206265656e207265776172646564206279207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d14536c61736808244163636f756e7449641c42616c616e6365082501204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e58205c5b76616c696461746f722c20616d6f756e745c5d684f6c64536c617368696e675265706f7274446973636172646564043053657373696f6e496e646578081d0120416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c6490206e6f742062652070726f6365737365642e205c5b73657373696f6e5f696e6465785c5d3c5374616b696e67456c656374696f6e043c456c656374696f6e436f6d7075746504f42041206e657720736574206f66207374616b6572732077617320656c656374656420776974682074686520676976656e205c5b636f6d707574655c5d2e38536f6c7574696f6e53746f726564043c456c656374696f6e436f6d707574650419012041206e657720736f6c7574696f6e20666f7220746865207570636f6d696e6720656c656374696f6e20686173206265656e2073746f7265642e205c5b636f6d707574655c5d18426f6e64656408244163636f756e7449641c42616c616e636510d420416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d005101204e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c25012069742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e64656408244163636f756e7449641c42616c616e636504dc20416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d2457697468647261776e08244163636f756e7449641c42616c616e6365085d0120416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560b02066726f6d2074686520756e6c6f636b696e672071756575652e205c5b73746173682c20616d6f756e745c5d1c3853657373696f6e735065724572613053657373696f6e496e64657810060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e20457261496e64657810a800000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e20457261496e64657810a7000000140101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e00bc20546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2d012053657420746f203020696620736c61736865732073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f723820696e74657276656e74696f6e2e44456c656374696f6e4c6f6f6b616865616438543a3a426c6f636b4e756d62657210190000001c710120546865206e756d626572206f6620626c6f636b73206265666f72652074686520656e64206f6620746865206572612066726f6d20776869636820656c656374696f6e207375626d697373696f6e732061726520616c6c6f7765642e006d012053657474696e67207468697320746f207a65726f2077696c6c2064697361626c6520746865206f6666636861696e20636f6d7075746520616e64206f6e6c79206f6e2d636861696e207365712d70687261676d656e2077696c6c2420626520757365642e007501205468697320697320626f756e646564206279206265696e672077697468696e20746865206c6173742073657373696f6e2e2048656e63652c2073657474696e6720697420746f20612076616c7565206d6f7265207468616e207468659c206c656e677468206f6620612073657373696f6e2077696c6c20626520706f696e746c6573732e344d6178497465726174696f6e730c753332100a0000000c2901204d6178696d756d206e756d626572206f662062616c616e63696e6720697465726174696f6e7320746f2072756e20696e20746865206f6666636861696e207375626d697373696f6e2e00ec2049662073657420746f20302c2062616c616e63655f736f6c7574696f6e2077696c6c206e6f7420626520657865637574656420617420616c6c2e504d696e536f6c7574696f6e53636f726542756d701c50657262696c6c1020a1070004610120546865207468726573686f6c64206f6620696d70726f76656d656e7420746861742073686f756c642062652070726f766964656420666f722061206e657720736f6c7574696f6e20746f2062652061636365707465642e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f720c753332104000000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00690120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e20636c61696d2101207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e7c344e6f74436f6e74726f6c6c65720468204e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f7453746173680454204e6f742061207374617368206163636f756e742e34416c7265616479426f6e646564046420537461736820697320616c726561647920626f6e6465642e34416c7265616479506169726564047820436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d70747954617267657473046420546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e6465780444204475706c696361746520696e6465782e44496e76616c6964536c617368496e646578048820536c617368207265636f726420696e646578206f7574206f6620626f756e64732e44496e73756666696369656e7456616c756504cc2043616e206e6f7420626f6e6420776974682076616c7565206c657373207468616e206d696e696d756d2062616c616e63652e304e6f4d6f72654368756e6b7304942043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b04a42043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e64656454617267657404cc20417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264045c20496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73047c20496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e697175650484204974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564040d01205265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e7c4f6666636861696e456c656374696f6e4561726c795375626d697373696f6e04e420546865207375626d697474656420726573756c74206973207265636569766564206f7574206f6620746865206f70656e2077696e646f772e784f6666636861696e456c656374696f6e5765616b5375626d697373696f6e04010120546865207375626d697474656420726573756c74206973206e6f7420617320676f6f6420617320746865206f6e652073746f726564206f6e20636861696e2e4c536e617073686f74556e617661696c61626c6504d02054686520736e617073686f742064617461206f66207468652063757272656e742077696e646f77206973206d697373696e672e804f6666636861696e456c656374696f6e426f67757357696e6e6572436f756e7404b020496e636f7272656374206e756d626572206f662077696e6e65727320776572652070726573656e7465642e6c4f6666636861696e456c656374696f6e426f67757357696e6e6572086101204f6e65206f6620746865207375626d69747465642077696e6e657273206973206e6f7420616e206163746976652063616e646964617465206f6e20636861696e2028696e646578206973206f7574206f662072616e67653820696e20736e617073686f74292e704f6666636861696e456c656374696f6e426f677573436f6d70616374085d01204572726f72207768696c65206275696c64696e67207468652061737369676e6d656e7420747970652066726f6d2074686520636f6d706163742e20546869732063616e2068617070656e20696620616e20696e646578a820697320696e76616c69642c206f72206966207468652077656967687473205f6f766572666c6f775f2e784f6666636861696e456c656374696f6e426f6775734e6f6d696e61746f72041501204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f7273206973206e6f7420616e20616374697665206e6f6d696e61746f72206f6e20636861696e2e7c4f6666636861696e456c656374696f6e426f6775734e6f6d696e6174696f6e044d01204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e206564676520746f20776869636820746865792068617665206e6f7420766f746564206f6e20636861696e2e844f6666636861696e456c656374696f6e536c61736865644e6f6d696e6174696f6e086101204f6e65206f6620746865207375626d6974746564206e6f6d696e61746f72732068617320616e2065646765207768696368206973207375626d6974746564206265666f726520746865206c617374206e6f6e2d7a65726f5420736c617368206f6620746865207461726765742e744f6666636861696e456c656374696f6e426f67757353656c66566f746504250120412073656c6620766f7465206d757374206f6e6c79206265206f726967696e617465642066726f6d20612076616c696461746f7220746f204f4e4c59207468656d73656c7665732e644f6666636861696e456c656374696f6e426f6775734564676504450120546865207375626d697474656420726573756c742068617320756e6b6e6f776e206564676573207468617420617265206e6f7420616d6f6e67207468652070726573656e7465642077696e6e6572732e684f6666636861696e456c656374696f6e426f67757353636f72650419012054686520636c61696d65642073636f726520646f6573206e6f74206d61746368207769746820746865206f6e6520636f6d70757465642066726f6d2074686520646174612e844f6666636861696e456c656374696f6e426f677573456c656374696f6e53697a6504782054686520656c656374696f6e2073697a6520697320696e76616c69642e3843616c6c4e6f74416c6c6f776564044901205468652063616c6c206973206e6f7420616c6c6f7765642061742074686520676976656e2074696d652064756520746f207265737472696374696f6e73206f6620656c656374696f6e20706572696f642e54496e636f7272656374486973746f7279446570746804c420496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e7304b420496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e071c53657373696f6e011c53657373696f6e1c2856616c696461746f727301004c5665633c543a3a56616c696461746f7249643e0400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e64657801003053657373696f6e496e646578100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010010626f6f6c040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b6579730100785665633c28543a3a56616c696461746f7249642c20543a3a4b657973293e0400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f72730100205665633c7533323e04000c8020496e6469636573206f662064697361626c65642076616c696461746f72732e003501205468652073657420697320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e732061206e657720736574206f66206964656e7469746965732e204e6578744b65797300010538543a3a56616c696461746f7249641c543a3a4b657973000400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010550284b65795479706549642c205665633c75383e2938543a3a56616c696461746f72496400040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e0108207365745f6b65797308106b6579731c543a3a4b6579731470726f6f661c5665633c75383e38e82053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e210120416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743e54202d20436f6d706c65786974793a20604f28312960590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a4202d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b6579736084202d204462526561647320706572206b65792069643a20604b65794f776e65726088202d20446257726974657320706572206b65792069643a20604b65794f776e657260302023203c2f7765696768743e2870757267655f6b6579730030cc2052656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722ec4205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d420546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002c2023203c7765696768743eb4202d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e590120202041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642ef0202d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a4202d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e74608c202d20446257726974657320706572206b65792069643a20604b65794f776e64657260302023203c2f7765696768743e0104284e657753657373696f6e043053657373696f6e496e646578086501204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e7420697320746865205c5b73657373696f6e5f696e6465785c5d2c206e6f742074686520626c6f636b88206e756d626572206173207468652074797065206d6967687420737567676573742e001030496e76616c696450726f6f66046420496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f72496404a0204e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b657904682052656769737465726564206475706c6963617465206b65792e184e6f4b65797304a8204e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e0828486973746f726963616c0000000000093c46696e616c697479547261636b65720001042866696e616c5f68696e74041068696e745c436f6d706163743c543a3a426c6f636b4e756d6265723e08f42048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a65646c20626c6f636b2069732074686520676976656e206e756d6265722e00082857696e646f7753697a6538543a3a426c6f636b4e756d626572106500000004190120546865206e756d626572206f6620726563656e742073616d706c657320746f206b6565702066726f6d207468697320636861696e2e2044656661756c74206973203130312e345265706f72744c6174656e637938543a3a426c6f636b4e756d62657210e8030000041d01205468652064656c617920616674657220776869636820706f696e74207468696e6773206265636f6d6520737573706963696f75732e2044656661756c7420697320313030302e0838416c72656164795570646174656404c82046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b1c42616448696e7404902046696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265720a1c4772616e647061013c4772616e64706146696e616c6974791814537461746501006c53746f72656453746174653c543a3a426c6f636b4e756d6265723e04000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e676500008c53746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723e040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000038543a3a426c6f636b4e756d626572040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c656400008028543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d626572290400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e7453657449640100145365744964200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e0001051453657449643053657373696f6e496e6465780004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e010c4c7265706f72745f65717569766f636174696f6e084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66100d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e6564084865717569766f636174696f6e5f70726f6f66a845717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3c6b65795f6f776e65725f70726f6f6640543a3a4b65794f776e657250726f6f66240d01205265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f82065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66fc20616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e6365482077696c6c206265207265706f727465642e00110120546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c79190120626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c206173207375636819012069662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e28207265706f727465722e306e6f74655f7374616c6c6564081464656c617938543a3a426c6f636b4e756d6265726c626573745f66696e616c697a65645f626c6f636b5f6e756d62657238543a3a426c6f636b4e756d6265721c1d01204e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c69747920676164676574206861732901207374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e672101206f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c617915012073686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e6720746865290120666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f7465727329012077696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e5c204f6e6c792063616c6c61626c6520627920726f6f742e010c384e6577417574686f7269746965730434417574686f726974794c69737404d8204e657720617574686f726974792073657420686173206265656e206170706c6965642e205c5b617574686f726974795f7365745c5d1850617573656400049c2043757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640004a02043757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e001c2c50617573654661696c656408090120417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a8202865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c656408150120417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a42028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e6704ec20417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e04c02043616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f660435012041206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f6604350120416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f7274041901204120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e0b20496d4f6e6c696e650120496d4f6e6c696e6510384865617274626561744166746572010038543a3a426c6f636b4e756d62657210000000001831012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e2063757272656e742073657373696f6e2e0011012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c64d02066616c6c20726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e010120546865206964656120697320746f206669727374207761697420666f72207468652076616c696461746f727320746f2070726f64756365206120626c6f636b390120696e207468652063757272656e742073657373696f6e2c20736f20746861742074686520686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e104b65797301004c5665633c543a3a417574686f7269747949643e040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730002053053657373696f6e496e6465782441757468496e6465781c5665633c75383e05040008f020466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206041757468496e6465786020746f8020606f6666636861696e3a3a4f70617175654e6574776f726b5374617465602e38417574686f726564426c6f636b730102053053657373696f6e496e64657838543a3a56616c696461746f7249640c75333205100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f662060543a3a56616c696461746f7249646020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e0104246865617274626561740824686561727462656174644865617274626561743c543a3a426c6f636b4e756d6265723e285f7369676e6174757265bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e6174757265242c2023203c7765696768743e4101202d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e290101202020616e642045206973206c656e677468206f6620606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373608c2020202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60b02020202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e677468206045603d01202d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5c202020605265636569766564486561727462656174736084202d2044625772697465733a206052656365697665644865617274626561747360302023203c2f7765696768743e010c444865617274626561745265636569766564042c417574686f7269747949640405012041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f72697479496460205c5b617574686f726974795f69645c5d1c416c6c476f6f640004d42041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504605665633c4964656e74696669636174696f6e5475706c653e043d012041742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265205c5b6f66666c696e655c5d2e000828496e76616c69644b65790464204e6f6e206578697374656e74207075626c6963206b65792e4c4475706c6963617465644865617274626561740458204475706c696361746564206865617274626561742e0c48417574686f72697479446973636f766572790001000000000d204f6666656e63657301204f6666656e636573101c5265706f727473000105345265706f727449644f663c543ed04f6666656e636544657461696c733c543a3a4163636f756e7449642c20543a3a4964656e74696669636174696f6e5475706c653e00040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e4044656665727265644f6666656e6365730100645665633c44656665727265644f6666656e63654f663c543e3e0400086501204465666572726564207265706f72747320746861742068617665206265656e2072656a656374656420627920746865206f6666656e63652068616e646c657220616e64206e65656420746f206265207375626d6974746564442061742061206c617465722074696d652e58436f6e63757272656e745265706f727473496e646578010205104b696e64384f706171756554696d65536c6f74485665633c5265706f727449644f663c543e3e050400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e646578010105104b696e641c5665633c75383e00040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e010001041c4f6666656e63650c104b696e64384f706171756554696d65536c6f7410626f6f6c10550120546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e644d0120286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e206c617374190120656c656d656e7420696e64696361746573206f6620746865206f6666656e636520776173206170706c69656420287472756529206f7220717565756564202866616c73652974205c5b6b696e642c2074696d65736c6f742c206170706c6965645c5d2e00000e6052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100305665633c543a3a486173683e04000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e01000000000f105375646f01105375646f040c4b6579010030543a3a4163636f756e74496480000000000000000000000000000000000000000000000000000000000000000004842054686520604163636f756e74496460206f6620746865207375646f206b65792e0110107375646f041063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e547375646f5f756e636865636b65645f776569676874081063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e1c5f776569676874185765696768742839012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e310120546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b4205375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292ed0202d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e302023203c2f7765696768743e1c7365745f6b6579040c6e65778c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263652475012041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e44202d204f6e65204442206368616e67652e302023203c2f7765696768743e1c7375646f5f6173080c77686f8c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263651063616c6c5c426f783c3c542061732054726169743e3a3a43616c6c3e2c51012041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d44206120676976656e206163636f756e742e00d020546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002c2023203c7765696768743e20202d204f2831292e64202d204c696d697465642073746f726167652072656164732e60202d204f6e6520444220777269746520286576656e74292ec8202d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e302023203c2f7765696768743e010c14537564696404384469737061746368526573756c74048c2041207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e67656404244163636f756e74496404010120546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e285375646f4173446f6e650410626f6f6c048c2041207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d00042c526571756972655375646f04802053656e646572206d75737420626520746865205375646f206163636f756e74101c436f756e63696c011c436f756e63696c24145374616765010088436f756e63696c53746167655570646174653c543a3a426c6f636b4e756d6265723e340000000000000000000000000004742043757272656e7420636f756e63696c20766f74696e6720737461676538436f756e63696c4d656d6265727301005c5665633c436f756e63696c4d656d6265724f663c543e3e040004602043757272656e7420636f756e63696c206d656d626572732843616e646964617465730101022c543a3a4d656d6265724964f843616e6469646174653c543a3a4163636f756e7449642c2042616c616e63653c543e2c20543a3a486173682c20566f7465506f7765724f663a3a3c543e3e00a501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041101204d6170206f6620616c6c2063616e64696461746573207468617420657665722063616e6469646174656420616e6420686176656e277420756e7374616b65207965742e50416e6e6f756e63656d656e74506572696f644e7201000c753634200000000000000000085d0120496e646578206f66207468652063757272656e742063616e64696461637920706572696f642e20497420697320696e6372656d656e74656420657665727974696d6520616e6e6f756e63656d656e7420706572696f6420207374617274732e1842756467657401002842616c616e63653c543e400000000000000000000000000000000004c82042756467657420666f722074686520636f756e63696c277320656c6563746564206d656d6265727320726577617264732e484e6578745265776172645061796d656e7473010038543a3a426c6f636b4e756d626572100000000004290120546865206e65787420626c6f636b20696e2077686963682074686520656c656374656420636f756e63696c206d656d62657220726577617264732077696c6c2062652070617965642e404e657874427564676574526566696c6c010038543a3a426c6f636b4e756d626572100000000004d820546865206e65787420626c6f636b20696e20776869636820746865206275646765742077696c6c20626520696e637265617365642e3c427564676574496e6372656d656e7401002842616c616e63653c543e400000000000000000000000000000000004d420416d6f756e74206f662062616c616e636520746f20626520726566696c6c65642065766572792062756467657420706572696f643c436f756e63696c6f7252657761726401002842616c616e63653c543e4000000000000000000000000000000000046c20436f756e63696c6f72207265776172642070657220626c6f636b012c48616e6e6f756e63655f63616e64696461637910346d656d626572736869705f69642c543a3a4d656d6265724964487374616b696e675f6163636f756e745f696430543a3a4163636f756e744964447265776172645f6163636f756e745f696430543a3a4163636f756e744964147374616b652842616c616e63653c543e2450205375627363726962652063616e646964617465002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5c72656c656173655f63616e6469646163795f7374616b6504346d656d626572736869705f69642c543a3a4d656d626572496424c82052656c656173652063616e646964616379207374616b652074686174206973206e6f206c6f6e676572206e65656465642e002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4877697468647261775f63616e64696461637904346d656d626572736869705f69642c543a3a4d656d626572496424c02057697468647261772063616e64696461637920616e642072656c656173652063616e646964616379207374616b652e002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e487365745f63616e6469646163795f6e6f746508346d656d626572736869705f69642c543a3a4d656d6265724964106e6f74651c5665633c75383e287d01205365742073686f7274206465736372697074696f6e20666f7220746865207573657227732063616e6469646163792e2043616e2062652063616c6c656420616e7974696d6520647572696e67207573657227732063616e6469646163792e002c2023203c7765696768743e0028202323207765696768743c20604f20284e29602077686572653a7020604e6020697320746865206c656e677468206f6620606e6f74656018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f627564676574041c62616c616e63652842616c616e63653c543e2464205365747320746865206275646765742062616c616e63652e002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e48706c616e5f6275646765745f726566696c6c042c6e6578745f726566696c6c38543a3a426c6f636b4e756d626572247420506c616e20746865206e6578742062756467657420726566696c6c2e002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507365745f6275646765745f696e6372656d656e7404406275646765745f696e6372656d656e742842616c616e63653c543e24782053657473207468652062756467657420726566696c6c20616d6f756e74002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507365745f636f756e63696c6f725f7265776172640440636f756e63696c6f725f7265776172642842616c616e63653c543e249020536574732074686520636f756e63696c6f72207265776172642070657220626c6f636b002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c66756e64696e675f72657175657374044066756e64696e675f7265717565737473dc5665633c46756e64696e6752657175657374506172616d65746572733c42616c616e63653c543e2c20543a3a4163636f756e7449643e3e28bc205472616e73666572732066756e64732066726f6d20636f756e63696c2062756467657420746f206163636f756e74002c2023203c7765696768743e0028202323207765696768743c20604f20284629602077686572653aa02060466020697320746865206c656e677468206f66206066756e64696e675f72657175657374736018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e40636f756e63696c6f725f72656d61726b0830636f756e63696c6f725f69642c543a3a4d656d62657249640c6d73671c5665633c75383e248420436f756e63696c6f72206d616b657320612072656d61726b206d657373616765002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4063616e6469646174655f72656d61726b083063616e6469646174655f69642c543a3a4d656d62657249640c6d73671c5665633c75383e24842043616e646964617465206d616b657320612072656d61726b206d657373616765002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e01485c416e6e6f756e63696e67506572696f6453746172746564000460204e657720636f756e63696c2077617320656c65637465644c4e6f74456e6f75676843616e646964617465730004210120416e6e6f756e63696e6720706572696f642063616e27742066696e6973682062656361757365206f6620696e73756666696369656e742063616e6469647461746520636f756e744c566f74696e67506572696f6453746172746564040c75363404ac2043616e646964617465732061726520616e6e6f756e63656420616e6420766f74696e6720737461727473304e657743616e64696461746510204d656d6265724964244163636f756e744964244163636f756e7449641c42616c616e63650460204e65772063616e64696461746520616e6e6f756e636564444e6577436f756e63696c456c656374656404345665633c4d656d62657249643e0498204e657720636f756e63696c2077617320656c656374656420616e64206170706f696e746564504e6577436f756e63696c4e6f74456c6563746564000470204e657720636f756e63696c20776173206e6f7420656c65637465645443616e6469646163795374616b6552656c6561736504204d656d626572496404dc2043616e646964616379207374616b65207468617420776173206e6f206c6f6e676572206e6565646564207761732072656c65617365644443616e646964616379576974686472617704204d656d626572496404982043616e646964617465206861732077697468647261776e206869732063616e6469646163794043616e6469646163794e6f746553657408204d656d62657249641c5665633c75383e04d4205468652063616e64696461746520686173207365742061206e6577206e6f746520666f722074686569722063616e646964616379345265776172645061796d656e7410204d656d6265724964244163636f756e7449641c42616c616e63651c42616c616e636504c4205468652077686f6c652072657761726420776173207061696420746f2074686520636f756e63696c206d656d6265722e4042756467657442616c616e6365536574041c42616c616e636504a0204275646765742062616c616e636520776173206368616e6765642062792074686520726f6f742e30427564676574526566696c6c041c42616c616e636504c8204275646765742062616c616e63652077617320696e63726561736564206279206175746f6d6174696320726566696c6c2e4c427564676574526566696c6c506c616e6e6564042c426c6f636b4e756d626572049020546865206e6578742062756467657420726566696c6c2077617320706c616e6e65642e58427564676574496e6372656d656e7455706461746564041c42616c616e6365048c2042756467657420696e6372656d656e7420686173206265656e20757064617465642e58436f756e63696c6f7252657761726455706461746564041c42616c616e6365048c20436f756e63696c6f722072657761726420686173206265656e20757064617465642e345265717565737446756e64656408244163636f756e7449641c42616c616e63650460205265717565737420686173206265656e2066756e64656444436f756e63696c6f7252656d61726b656408204d656d62657249641c5665633c75383e046420436f756e63696c6f722072656d61726b206d6573736167654443616e64696461746552656d61726b656408204d656d62657249641c5665633c75383e04642043616e6469646174652072656d61726b206d65737361676524684d696e4e756d6265724f66457874726143616e646964617465730c753634200100000000000000080901204d696e696d756d206e756d626572206f662065787472612063616e64696461746573206e656564656420666f72207468652076616c696420656c656374696f6e2e2d01204e756d626572206f6620746f74616c2063616e6469646174657320697320657175616c20746f20636f756e63696c2073697a6520706c75732065787472612063616e646964617465732e2c436f756e63696c53697a650c753634200500000000000000045420436f756e63696c206d656d62657220636f756e74444d696e43616e6469646174655374616b652842616c616e63653c543e40f82a00000000000000000000000000000490204d696e696d756d207374616b652063616e6469646174652068617320746f206c6f636b60416e6e6f756e63696e67506572696f644475726174696f6e38543a3a426c6f636b4e756d62657210403800000474204475726174696f6e206f6620616e6e6f6e63696e6720706572696f644849646c65506572696f644475726174696f6e38543a3a426c6f636b4e756d6265721000e100000460204475726174696f6e206f662069646c6520706572696f6464456c65637465644d656d626572526577617264506572696f6438543a3a426c6f636b4e756d626572104038000004a020496e74657276616c20666f72206175746f6d6174696320726577617264207061796d656e74732e48427564676574526566696c6c506572696f6438543a3a426c6f636b4e756d626572104038000004ac20496e74657276616c206265747765656e206175746f6d617469632062756467657420726566696c6c732e3c43616e6469646163794c6f636b4964384c6f636b4964656e7469666965722063616e6469646163048c204578706f72747320636f6e7374202d2063616e646964616379206c6f636b2069642e3c436f756e63696c6f724c6f636b4964384c6f636b4964656e74696669657220636f756e63696c6f048c204578706f72747320636f6e7374202d20636f756e63696c6f72206c6f636b2069642e50244261644f726967696e044c204f726967696e20697320696e76616c69642e4043616e7443616e6469646174654e6f77043d01205573657220747269656420746f20616e6e6f756e63652063616e646964616379206f757473696465206f66207468652063616e64696461637920616e6e6f756e63656d656e7420706572696f642e4c43616e7452656c656173655374616b654e6f7704f4205573657220747269656420746f2072656c65617365207374616b65206f757473696465206f66207468652072657665616c696e6720706572696f642e5043616e6469646163795374616b65546f6f4c6f7704b42043616e64696461746520686176656e27742070726f76696465642073756666696369656e74207374616b652e4843616e7443616e646964617465547769636504f8205573657220747269656420746f20616e6e6f756e63652063616e64696461637920747769636520696e207468652073616d6520656c656374696f6e732e40436f6e666c696374696e675374616b65086101205573657220747269656420746f20616e6e6f756e63652063616e646964616379207769746820616e206163636f756e742074686174206861732074686520636f6e666c696374696e672074797065206f66207374616b653d0120776974682063616e646964616379207374616b6520616e6420686173206e6f7420656e6f7567682062616c616e636520666f72207374616b696e6720666f7220626f746820707572706f7365732e405374616b655374696c6c4e656564656404e020436f756e63696c206d656d62657220616e642063616e646964617465732063616e2774207769746864726177207374616b65207965742e1c4e6f5374616b6504c8205573657220747269656420746f2072656c65617365207374616b65207768656e206e6f207374616b65206578697374732e74496e73756666696369656e7442616c616e6365466f725374616b696e6704b020496e73756666696369656e742062616c616e636520666f722063616e646964616379207374616b696e672e4c43616e74566f7465466f72596f757273656c6604882043616e6469646174652063616e277420766f746520666f722068696d73656c662e5c4d656d62657249644e6f744d617463684163636f756e74045020496e76616c6964206d656d626572736869702e68496e76616c69644163636f756e74546f5374616b6552657573650855012054686520636f6d62696e6174696f6e206f66206d656d6265727368697020696420616e64206163636f756e7420696420697320696e76616c696420666f7220756e7374616b696e6720616e206578697374696e67442063616e646964616379207374616b652e444e6f7443616e6469646174696e674e6f7704dc205573657220747269656420746f2077697468647261772063616e646964616379207768656e206e6f742063616e6469646174696e672e6043616e74576974686472617743616e6469646163794e6f77041d012043616e27742077697468647261772063616e646964616379206f757473696465206f66207468652063616e64696461637920616e6e6f756e63656d656e7420706572696f642e304e6f74436f756e63696c6f72047c20546865206d656d626572206973206e6f74206120636f756e63696c6f722e88496e73756666696369656e7446756e6473466f7246756e64696e675265717565737404f420496e737566666963656e742066756e647320696e20636f756e63696c20666f7220657865637574696e67202746756e64696e67205265717565737427585a65726f42616c616e636546756e645265717565737404602046756e642072657175657374206e6f2062616c616e636568526570656174656446756e64526571756573744163636f756e74040101205468652073616d65206163636f756e7420697320726563696576696e672066756e64732066726f6d207468652073616d65207265717565737420747769636550456d70747946756e64696e67526571756573747304b02046756e64696e6720726571756573747320776974686f757420726563696576696e67206163636f756e74735443616e646964617465446f65734e6f744578697374045c2043616e646964617465206964206e6f7420666f756e6411285265666572656e64756d014c496e7374616e6365315265666572656e64756d081453746167650100e85265666572656e64756d53746167653c543a3a426c6f636b4e756d6265722c20543a3a4d656d62657249642c20543a3a566f7465506f7765723e040004682043757272656e74207265666572656e64756d2073746167652e14566f74657301010230543a3a4163636f756e7449643443617374566f74654f663c543e00e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018510120566f746573206361737420696e20746865207265666572656e64756d2e2041206e6577207265636f726420697320616464656420746f2074686973206d6170207768656e20612075736572206361737473206134207365616c656420766f74652e0101204974206973206d6f646966696564207768656e206120757365722072657665616c732074686520766f7465277320636f6d6d69746d656e742070726f6f662e55012041207265636f72642069732066696e616c6c792072656d6f766564207768656e20746865207573657220756e7374616b65732c2077686963682063616e2068617070656e20647572696e67206120766f74696e679c207374616765206f72206166746572207468652063757272656e74206379636c6520656e64732ef82041207374616b6520666f72206120766f74652063616e2062652072657573656420696e20667574757265207265666572656e64756d206379636c65732e010c10766f74650828636f6d6d69746d656e741c543a3a48617368147374616b653042616c616e63654f663c543e249820436173742061207365616c656420766f746520696e20746865207265666572656e64756d2e002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c72657665616c5f766f7465081073616c741c5665633c75383e38766f74655f6f7074696f6e5f6964d03c5420617320636f6d6d6f6e3a3a6d656d626572736869703a3a4d656d6265727368697054797065733e3a3a4d656d62657249642ca02052657665616c2061207365616c656420766f746520696e20746865207265666572656e64756d2e002c2023203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a1101202d2060576020697320746865206e756d626572206f662060696e7465726d6564696174655f77696e6e657273602073746f72656420696e207468652063757272656e746c20202020206053746167653a3a3c542c20493e3a3a67657428296018202d2044423ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4872656c656173655f766f74655f7374616b650020602052656c656173652061206c6f636b6564207374616b652e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e011c445265666572656e64756d53746172746564040c753634044c205265666572656e64756d20737461727465646c5265666572656e64756d53746172746564466f72636566756c6c79040c753634044c205265666572656e64756d20737461727465645452657665616c696e675374616765537461727465640004682052657665616c696e672070686173652068617320626567756e485265666572656e64756d46696e697368656404985665633c4f7074696f6e526573756c743c4d656d62657249642c20566f7465506f7765723e3e04c4205265666572656e64756d20656e64656420616e642077696e6e696e67206f7074696f6e207761732073656c656374656420566f7465436173740c244163636f756e74496410486173681c42616c616e6365047c20557365722063617374206120766f746520696e207265666572656e64756d30566f746552657665616c65640c244163636f756e744964204d656d62657249641c5665633c75383e045c20557365722072657665616c65642068697320766f7465345374616b6552656c656173656404244163636f756e744964046020557365722072656c656173656420686973207374616b6514344d617853616c744c656e6774680c753634202000000000000000085d01204d6178696d756d206c656e677468206f6620766f746520636f6d6d69746d656e742073616c742e20557365206c656e677468207468617420656e737572657320756e697175656e65737320666f722068617368696e675020652e672e207374643a3a7536343a3a4d41582e44566f746553746167654475726174696f6e38543a3a426c6f636b4e756d626572104038000004b0204475726174696f6e206f6620766f74696e6720737461676520286e756d626572206f6620626c6f636b73294c52657665616c53746167654475726174696f6e38543a3a426c6f636b4e756d626572104038000004bc204475726174696f6e206f662072657665616c696e6720737461676520286e756d626572206f6620626c6f636b7329304d696e696d756d5374616b653042616c616e63654f663c543e40102700000000000000000000000000000480204d696e696d756d207374616b65206e656564656420666f7220766f74696e67505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e74696669657220766f74696e67202004a4204578706f72747320636f6e7374202d207374616b696e672068616e646c6572206c6f636b2069642e34244261644f726967696e0448204f726967696e20697320696e76616c6964505265666572656e64756d4e6f7452756e6e696e6704ac205265666572656e64756d206973206e6f742072756e6e696e67207768656e20657870656374656420746f5852657665616c696e674e6f74496e50726f677265737304b42052657665616c696e67207374616765206973206e6f7420696e2070726f6772657373207269676874206e6f775c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e68496e73756666696369656e7442616c616e6365546f5374616b6504a0204163636f756e7420496e73756666696369656e7420467265652042616c616e636520286e6f772944496e73756666696369656e745374616b6504ac20496e73756666696369656e74207374616b652070726f766964656420746f2063617374206120766f746534496e76616c696452657665616c041d012053616c7420616e64207265666572656e64756d206f7074696f6e2070726f766964656420646f6e277420636f72726573706f6e6420746f2074686520636f6d6d69746d656e742c496e76616c6964566f746504a820566f746520666f72206e6f74206578697374696e67206f7074696f6e207761732072657665616c65643c566f74654e6f744578697374696e6704a020547279696e6720746f2072657665616c20766f7465207468617420776173206e6f74206361737454416c7265616479566f746564546869734379636c6504bc20547279696e6720746f20766f7465206d756c7469706c652074696d6520696e207468652073616d65206379636c6560556e7374616b696e67566f7465496e53616d654379636c6504a420496e76616c69642074696d6520746f2072656c6561736520746865206c6f636b6564207374616b652c53616c74546f6f4c6f6e6704442053616c7420697320746f6f206c6f6e6748556e7374616b696e67466f7262696464656e04f420556e7374616b696e6720686173206265656e20666f7262696464656e20666f7220746865207573657220286174206c6561737420666f72206e6f7729121c4d656d6265727301284d656d6265727368697020304e6578744d656d626572496401002c543a3a4d656d6265724964200000000000000000084501204d656d626572496420746f2061737369676e20746f206e657874206d656d626572207468617420697320616464656420746f207468652072656769737472792c20616e6420697320616c736f20746865e820746f74616c206e756d626572206f66206d656d6265727320637265617465642e204d656d626572496473207374617274206174205a65726f2e384d656d62657273686970427949640101022c543a3a4d656d6265724964344d656d626572736869703c543e0019010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d0204d617070696e67206f66206d656d626572277320696420746f207468656972206d656d626572736869702070726f66696c652e504d656d6265724964427948616e646c65486173680101021c5665633c75383e2c543a3a4d656d626572496400200000000000000000040501205265676973746572656420756e697175652068616e646c6573206861736820616e64207468656972206d617070696e6720746f207468656972206f776e65722e2c526566657272616c4375740100087538040004410120526566657272616c206375742070657263656e74206f6620746865206d656d626572736869702066656520746f2072656365697665206f6e20627579696e6720746865206d656d626572736869702e3c4d656d62657273686970507269636501003042616c616e63654f663c543e406400000000000000000000000000000004682043757272656e74206d656d626572736869702070726963652e58496e697469616c496e7669746174696f6e436f756e7401000c753332100500000004e820496e697469616c20696e7669746174696f6e20636f756e7420666f7220746865206e65776c7920626f75676874206d656d626572736869702e60496e697469616c496e7669746174696f6e42616c616e636501003042616c616e63654f663c543e406400000000000000000000000000000004cc20496e697469616c20696e7669746174696f6e2062616c616e636520666f722074686520696e7669746564206d656d6265722e705374616b696e674163636f756e7449644d656d62657253746174757301010230543a3a4163636f756e744964a05374616b696e674163636f756e744d656d62657242696e64696e673c543a3a4d656d62657249643e002400000000000000000004250120446f75626c65206f662061207374616b696e67206163636f756e7420696420616e64206d656d62657220696420746f2074686520636f6e6669726d6174696f6e207374617475732e013c386275795f6d656d626572736869700418706172616d73c84275794d656d62657273686970506172616d65746572733c543a3a4163636f756e7449642c20543a3a4d656d62657249643e3480204e6f6e2d6d656d626572732063616e20627579206d656d626572736869702e0024203c7765696768743e0028202323205765696768746c20604f202857202b2056202b2058202b205929602077686572653a64202d2060576020697320746865206d656d626572206e616d656c202d2060566020697320746865206d656d6265722068616e646c657c202d2060586020697320746865206d656d626572206176617461722075726968202d2060596020697320746865206d656d6265722061626f757418202d2044423a28202020202d204f285629302023203c2f7765696768743e387570646174655f70726f66696c650c246d656d6265725f69642c543a3a4d656d62657249641868616e646c653c4f7074696f6e3c5665633c75383e3e206d657461646174613c4f7074696f6e3c5665633c75383e3e2c110120557064617465206d656d626572277320616c6c206f7220736f6d65206f66206e616d652c2068616e646c652c2061766174617220616e642061626f757420746578742e80204e6f20656666656374206966206e6f206368616e676564206669656c64732e0024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a6c202d20605760206973207468652068616e646c65206c656e67746818202d2044423a28202020202d204f285729302023203c2f7765696768743e3c7570646174655f6163636f756e74730c246d656d6265725f69642c543a3a4d656d6265724964406e65775f726f6f745f6163636f756e74504f7074696f6e3c543a3a4163636f756e7449643e586e65775f636f6e74726f6c6c65725f6163636f756e74504f7074696f6e3c543a3a4163636f756e7449643e2c59012055706461746573206d656d62657220726f6f74206f7220636f6e74726f6c6c6572206163636f756e74732e204e6f2065666665637420696620626f7468206e6577206163636f756e74732061726520656d7074792e0024203c7765696768743e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e6c7570646174655f70726f66696c655f766572696669636174696f6e0c24776f726b65725f696428543a3a4163746f724964407461726765745f6d656d6265725f69642c543a3a4d656d62657249642c69735f766572696669656410626f6f6c2449012055706461746573206d656d6265722070726f66696c6520766572696669636174696f6e207374617475732e20526571756972657320776f726b696e672067726f7570206d656d626572206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e407365745f726566657272616c5f637574043470657263656e745f76616c75650875382415012055706461746573206d656d6265727368697020726566657272616c206375742070657263656e742076616c75652e20526571756972657320726f6f74206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e407472616e736665725f696e76697465730c40736f757263655f6d656d6265725f69642c543a3a4d656d6265724964407461726765745f6d656d6265725f69642c543a3a4d656d6265724964446e756d6265725f6f665f696e76697465730c75333224b8205472616e736665727320696e76697465732066726f6d206f6e65206d656d62657220746f20616e6f746865722e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34696e766974655f6d656d6265720418706172616d73d4496e766974654d656d62657273686970506172616d65746572733c543a3a4163636f756e7449642c20543a3a4d656d62657249643e345420496e766974652061206e6577206d656d6265722e0024203c7765696768743e0028202323205765696768746c20604f202857202b2056202b2058202b205929602077686572653a64202d2060576020697320746865206d656d626572206e616d656c202d2060566020697320746865206d656d6265722068616e646c657c202d2060586020697320746865206d656d626572206176617461722075726968202d2060596020697320746865206d656d6265722061626f757418202d2044423a28202020202d204f285629302023203c2f7765696768743e507365745f6d656d626572736869705f707269636504246e65775f70726963653042616c616e63654f663c543e24c02055706461746573206d656d626572736869702070726963652e20526571756972657320726f6f74206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e6c7365745f6c65616465725f696e7669746174696f6e5f71756f74610440696e7669746174696f6e5f71756f74610c75333224dc2055706461746573206c656164657220696e7669746174696f6e2071756f74612e20526571756972657320726f6f74206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e787365745f696e697469616c5f696e7669746174696f6e5f62616c616e6365044c6e65775f696e697469616c5f62616c616e63653042616c616e63654f663c543e243d01205570646174657320696e697469616c20696e7669746174696f6e2062616c616e636520666f72206120696e7669746564206d656d6265722e20526571756972657320726f6f74206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e707365745f696e697469616c5f696e7669746174696f6e5f636f756e7404506e65775f696e7669746174696f6e5f636f756e740c753332241501205570646174657320696e697469616c20696e7669746174696f6e20636f756e7420666f722061206d656d6265722e20526571756972657320726f6f74206f726967696e2e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e746164645f7374616b696e675f6163636f756e745f63616e64696461746504246d656d6265725f69642c543a3a4d656d626572496428b020416464207374616b696e67206163636f756e742063616e64696461746520666f722061206d656d6265722ebc20546865206d656d62657273686970206d75737420626520636f6e6669726d6564206265666f72652075736167652e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5872656d6f76655f7374616b696e675f6163636f756e7404246d656d6265725f69642c543a3a4d656d626572496424942052656d6f7665207374616b696e67206163636f756e7420666f722061206d656d6265722e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5c636f6e6669726d5f7374616b696e675f6163636f756e7408246d656d6265725f69642c543a3a4d656d6265724964487374616b696e675f6163636f756e745f696430543a3a4163636f756e74496424c020436f6e6669726d207374616b696e67206163636f756e742063616e64696461746520666f722061206d656d6265722e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e346d656d6265725f72656d61726b08246d656d6265725f69642c543a3a4d656d62657249640c6d73671c5665633c75383e2458204d656d626572206d616b657320612072656d61726b0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e013c344d656d626572496e766974656408204d656d626572496468496e766974654d656d62657273686970506172616d657465727300404d656d62657273686970426f7567687408204d656d62657249645c4275794d656d62657273686970506172616d657465727300504d656d62657250726f66696c65557064617465640c204d656d62657249643c4f7074696f6e3c5665633c75383e3e3c4f7074696f6e3c5665633c75383e3e00544d656d6265724163636f756e7473557064617465640c204d656d6265724964444f7074696f6e3c4163636f756e7449643e444f7074696f6e3c4163636f756e7449643e007c4d656d626572566572696669636174696f6e537461747573557064617465640c204d656d626572496410626f6f6c1c4163746f7249640048526566657272616c43757455706461746564040875380048496e76697465735472616e736665727265640c204d656d6265724964204d656d62657249640c75333200584d656d62657273686970507269636555706461746564041c42616c616e6365007c496e697469616c496e7669746174696f6e42616c616e636555706461746564041c42616c616e636500704c6561646572496e7669746174696f6e51756f746155706461746564040c7533320074496e697469616c496e7669746174696f6e436f756e7455706461746564040c753332004c5374616b696e674163636f756e74416464656408244163636f756e744964204d656d626572496400545374616b696e674163636f756e7452656d6f76656408244163636f756e744964204d656d6265724964005c5374616b696e674163636f756e74436f6e6669726d656408244163636f756e744964204d656d626572496400384d656d62657252656d61726b656408204d656d62657249641c5665633c75383e00185844656661756c744d656d6265727368697050726963653042616c616e63654f663c543e406400000000000000000000000000000004a0204578706f72747320636f6e7374202d2064656661756c74206d656d62657273686970206665652e64526566657272616c4375744d6178696d756d50657263656e740875380432044901204578706f72747320636f6e7374202d206d6178696d756d2070657263656e742076616c7565206f6620746865206d656d626572736869702066656520666f722074686520726566657272616c206375742e7c44656661756c74496e697469616c496e7669746174696f6e42616c616e63653042616c616e63654f663c543e406400000000000000000000000000000004e0204578706f72747320636f6e7374202d2064656661756c742062616c616e636520666f722074686520696e7669746564206d656d6265722e3843616e6469646174655374616b653042616c616e63654f663c543e40c800000000000000000000000000000004f8204578706f72747320636f6e7374202d205374616b65206e656564656420746f2063616e646964617465206173207374616b696e67206163636f756e742e4c496e76697465644d656d6265724c6f636b4964384c6f636b4964656e74696669657220696e766974656d6204a0204578706f72747320636f6e7374202d20696e7669746564206d656d626572206c6f636b2069642e585374616b696e6743616e6469646174654c6f636b4964384c6f636b4964656e74696669657220626f756e6473746104ac204578706f72747320636f6e7374202d207374616b696e672063616e646964617465206c6f636b2069642e4c7c4e6f74456e6f75676842616c616e6365546f4275794d656d626572736869700498204e6f7420656e6f7567682062616c616e636520746f20627579206d656d626572736869702e64436f6e74726f6c6c65724163636f756e745265717569726564047420436f6e74726f6c6c6572206163636f756e742072657175697265642e4c526f6f744163636f756e745265717569726564045c20526f6f74206163636f756e742072657175697265642e38556e7369676e65644f726967696e044020496e76616c6964206f726967696e2e544d656d62657250726f66696c654e6f74466f756e6404b8204d656d6265722070726f66696c65206e6f7420666f756e642028696e76616c6964206d656d626572206964292e5c48616e646c65416c726561647952656769737465726564046c2048616e646c6520616c726561647920726567697374657265642e9848616e646c654d757374426550726f7669646564447572696e67526567697374726174696f6e04b42048616e646c65206d7573742062652070726f766964656420647572696e6720726567697374726174696f6e2e4c526566657272657249734e6f744d656d62657204d42043616e6e6f742066696e642061206d656d6265727368697020666f7220612070726f76696465642072656665727265722069642e8443616e6e6f745472616e73666572496e7669746573466f724e6f744d656d626572049c2053686f756c642062652061206d656d62657220746f207265636569766520696e76697465732e404e6f74456e6f756768496e766974657304b0204e6f7420656e6f75676820696e766974657320746f20706572666f726d20616e206f7065726174696f6e2e60576f726b696e6747726f75704c65616465724e6f7453657404b0204d656d6265727368697020776f726b696e672067726f7570206c6561646572206973206e6f74207365742e845374616b696e674163636f756e744973416c72656164795265676973746572656404bc205374616b696e67206163636f756e74206973207265676973746572656420666f7220736f6d65206d656d6265722e645374616b696e674163636f756e74446f65736e74457869737404b8205374616b696e67206163636f756e7420666f72206d656d6265727368697020646f65736e27742065786973742e785374616b696e674163636f756e74416c7265616479436f6e6669726d656404b0205374616b696e67206163636f756e742068617320616c7265616479206265656e20636f6e6669726d65642eb0576f726b696e6747726f757042756467657449734e6f7453756666696369656e74466f72496e766974696e67084d012043616e6e6f7420696e766974652061206d656d6265722e20576f726b696e672067726f75702062616c616e6365206973206e6f742073756666696369656e7420746f20736574207468652064656661756c74242062616c616e63652e3c436f6e666c696374696e674c6f636b0445012043616e6e6f7420696e766974652061206d656d6265722e2054686520636f6e74726f6c6c6572206163636f756e742068617320616e206578697374696e6720636f6e666c696374696e67206c6f636b2e8c43616e6e6f74457863656564526566657272616c43757450657263656e744c696d69740405012043616e6e6f7420736574206120726566657272616c206375742070657263656e742076616c75652e20546865206c696d6974207761732065786365656465642e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e1314466f72756d0124466f72756d5f315f31283043617465676f72794279496401010234543a3a43617465676f72794964b443617465676f72793c543a3a43617465676f727949642c20543a3a54687265616449642c20543a3a486173683e003d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cc204d61702063617465676f7279206964656e74696669657220746f20636f72726573706f6e64696e672063617465676f72792e384e65787443617465676f72794964010034543a3a43617465676f727949642000000000000000000411012043617465676f7279206964656e7469666965722076616c756520746f206265207573656420666f7220746865206e6578742043617465676f727920637265617465642e3c43617465676f7279436f756e746572010034543a3a43617465676f72794964200000000000000000049420436f756e74657220666f7220616c6c206578697374696e672063617465676f726965732e285468726561644279496401020234543a3a43617465676f727949642c543a3a54687265616449642c5468726561644f663c543e02a4000000000000000000000000000000000000000000000000000000000000000000000000000000000004bc204d617020746872656164206964656e74696669657220746f20636f72726573706f6e64696e67207468726561642e304e657874546872656164496401002c543a3a546872656164496420000000000000000004090120546872656164206964656e7469666965722076616c756520746f206265207573656420666f72206e6578742054687265616420696e20746872656164427949642e284e657874506f73744964010024543a3a506f7374496420000000000000000004f020506f7374206964656e7469666965722076616c756520746f206265207573656420666f7220666f72206e65787420706f737420637265617465642e4c43617465676f727942794d6f64657261746f7201020234543a3a43617465676f72794964384d6f64657261746f7249643c543e08282902000480204d6f64657261746f722073657420666f7220656163682043617465676f727944446174614d6967726174696f6e446f6e65010010626f6f6c0400040d012049662064617461206d6967726174696f6e20697320646f6e652c2073657420617320636f6e66696769626c6520666f7220756e6974207465737420707572706f736524506f6c6c566f7465730102022c543a3a546872656164496438466f72756d5573657249643c543e10626f6f6c020400042d0120556e697175652074687265616420706f6c6c20766f746572732e2054686973207072697661746520646f75626c65206d61702070726576656e747320646f75626c6520766f74696e672e20506f7374427949640102022c543a3a546872656164496424543a3a506f737449642501506f73743c466f72756d5573657249643c543e2c20543a3a54687265616449642c20543a3a486173682c2042616c616e63654f663c543e2c20543a3a0a426c6f636b4e756d6265723e021101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ac204d617020706f7374206964656e74696669657220746f20636f72726573706f6e64696e6720706f73742e01489c7570646174655f63617465676f72795f6d656d626572736869705f6f665f6d6f64657261746f720c306d6f64657261746f725f6964384d6f64657261746f7249643c543e2c63617465676f72795f696434543a3a43617465676f72794964246e65775f76616c756510626f6f6c240d0120456e61626c652061206d6f64657261746f722063616e206d6f64657261746520612063617465676f727920616e6420697473207375622063617465676f726965732e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c6372656174655f63617465676f72790c48706172656e745f63617465676f72795f6964544f7074696f6e3c543a3a43617465676f727949643e147469746c651c5665633c75383e2c6465736372697074696f6e1c5665633c75383e3050204164642061206e65772063617465676f72792e0024203c7765696768743e0028202323205765696768745c20604f202857202b2056202b205829602077686572653a70202d20605760206973207468652063617465676f7279206465707468ac202d2060566020697320746865206c656e677468206f66207468652063617465676f7279207469746c652ec4202d2060586020697320746865206c656e677468206f66207468652063617465676f7279206465736372697074696f6e2e18202d2044423a28202020202d204f285729302023203c2f7765696768743e7c7570646174655f63617465676f72795f617263686976616c5f7374617475730c146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f727949644c6e65775f617263686976616c5f73746174757310626f6f6c285c2055706461746520617263686976616c207374617475730024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a70202d20605760206973207468652063617465676f727920646570746818202d2044423a28202020202d204f285729302023203c2f7765696768743e547570646174655f63617465676f72795f7469746c650c146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f72794964147469746c651c5665633c75383e2c58205570646174652063617465676f7279207469746c650024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a70202d20605760206973207468652063617465676f7279206465707468ac202d2060566020697320746865206c656e677468206f66207468652063617465676f7279207469746c652e18202d2044423a28202020202d204f285729302023203c2f7765696768743e6c7570646174655f63617465676f72795f6465736372697074696f6e0c146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f727949642c6465736372697074696f6e1c5665633c75383e2c70205570646174652063617465676f7279206465736372697074696f6e0024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a70202d20605760206973207468652063617465676f7279206465707468c4202d2060566020697320746865206c656e677468206f66207468652063617465676f7279206465736372697074696f6e2e18202d2044423a28202020202d204f285729302023203c2f7765696768743e3c64656c6574655f63617465676f727908146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f7279496428402044656c6574652063617465676f72790024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a70202d20605760206973207468652063617465676f727920646570746818202d2044423a28202020202d204f285729302023203c2f7765696768743e346372656174655f7468726561641434666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964206d657461646174611c5665633c75383e10746578741c5665633c75383e28706f6c6c5f696e707574704f7074696f6e3c506f6c6c496e7075743c543a3a4d6f6d656e743e3e34a020437265617465206e65772074687265616420696e2063617465676f7279207769746820706f6c6c0024203c7765696768743e0028202323205765696768746c20604f202857202b2056202b2058202b205929602077686572653a70202d20605760206973207468652063617465676f7279206465707468a4202d2060566020697320746865206c656e677468206f662074686520746872656164207469746c652ea0202d2060586020697320746865206c656e677468206f66207468652074687265616420746578742ea8202d2060596020697320746865206e756d626572206f6620706f6c6c20616c7465726e6174697665732e18202d2044423a28202020202d204f285729302023203c2f7765696768743e50656469745f7468726561645f6d657461646174611034666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a5468726561644964306e65775f6d657461646174611c5665633c75383e2c54204564697420746872656164206d657461646174610024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a70202d20605760206973207468652063617465676f7279206465707468b0202d2060566020697320746865206c656e677468206f662074686520746872656164206d657461646174612e18202d2044423a28202020202d204f285729302023203c2f7765696768743e3464656c6574655f7468726561641034666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a5468726561644964106869646510626f6f6c28382044656c657465207468726561640024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a70202d20605760206973207468652063617465676f727920646570746818202d2044423a28202020202d204f285729302023203c2f7765696768743e5c6d6f76655f7468726561645f746f5f63617465676f727910146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a54687265616449643c6e65775f63617465676f72795f696434543a3a43617465676f727949642880204d6f76652074687265616420746f20616e6f746865722063617465676f72790024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a70202d20605760206973207468652063617465676f727920646570746818202d2044423a28202020202d204f285729302023203c2f7765696768743e30766f74655f6f6e5f706f6c6c1034666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a546872656164496414696e6465780c7533322c38205375626d6974206120706f6c6c0024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a74202d20605760206973207468652063617465676f72792064657074682ca8202d2060566020697320746865206e756d626572206f6620706f6c6c20616c7465726e6174697665732e18202d2044423a28202020202d204f285729302023203c2f7765696768743e3c6d6f6465726174655f74687265616410146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a546872656164496424726174696f6e616c651c5665633c75383e3040204d6f646572617465207468726561640024203c7765696768743e0028202323205765696768745c20604f202857202b2056202b205829602077686572653a74202d20605760206973207468652063617465676f72792064657074682c94202d2060566020697320746865206e756d626572206f662074687265616420706f7374732c94202d2060586020697320746865206c656e677468206f662074686520726174696f6e616c6518202d2044423a38202020202d204f2857202b205629302023203c2f7765696768743e206164645f706f73741434666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a546872656164496410746578741c5665633c75383e206564697461626c6510626f6f6c2c242041646420706f73740024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a74202d20605760206973207468652063617465676f72792064657074682c80202d2060566020697320746865206c656e677468206f6620746865207465787418202d2044423a28202020202d204f285729302023203c2f7765696768743e2872656163745f706f73741434666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a54687265616449641c706f73745f696424543a3a506f7374496414726561637444543a3a506f73745265616374696f6e4964285c204c696b65206f7220756e6c696b65206120706f73742e0024203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a74202d20605760206973207468652063617465676f72792064657074682c18202d2044423a28202020202d204f285729302023203c2f7765696768743e38656469745f706f73745f746578741434666f72756d5f757365725f696438466f72756d5573657249643c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a54687265616449641c706f73745f696424543a3a506f73744964206e65775f746578741c5665633c75383e2c3c204564697420706f737420746578740024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a74202d20605760206973207468652063617465676f72792064657074682c90202d2060566020697320746865206c656e677468206f6620746865206e6577207465787418202d2044423a28202020202d204f285729302023203c2f7765696768743e346d6f6465726174655f706f737414146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f72794964247468726561645f69642c543a3a54687265616449641c706f73745f696424543a3a506f7374496424726174696f6e616c651c5665633c75383e2c38204d6f64657261746520706f73740024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a74202d20605760206973207468652063617465676f72792064657074682c94202d2060566020697320746865206c656e677468206f662074686520726174696f6e616c6518202d2044423a28202020202d204f285729302023203c2f7765696768743e3064656c6574655f706f7374730c34666f72756d5f757365725f696438466f72756d5573657249643c543e14706f7374738442547265654d61703c457874656e646564506f737449643c543e2c20626f6f6c3e24726174696f6e616c651c5665633c75383e34682044656c65746520706f73742066726f6d2073746f726167652ef020596f75206e65656420746f2070726f76696465206120766563746f72206f6620706f73747320746f2064656c65746520696e2074686520666f726db82028543a3a43617465676f727949642c20543a3a54687265616449642c20543a3a506f737449642c20626f6f6c29290120776865726520746865206c61737420626f6f6c206973207768657468657220796f752077616e7420746f20686964652069742061706172742066726f6d2064656c6574696e672069740028202323205765696768745c20604f202857202b2056202b205029602077686572653a74202d20605760206973207468652063617465676f72792064657074682c94202d2060566020697320746865206c656e677468206f662074686520726174696f6e616c659c202d2060506020697320746865206e756d626572206f6620706f73747320746f2064656c65746518202d2044423a38202020202d204f2857202b205029302023203c2f7765696768743e507365745f737469636b6965645f746872656164730c146163746f724850726976696c656765644163746f723c543e2c63617465676f72795f696434543a3a43617465676f7279496430737469636b6965645f696473405665633c543a3a54687265616449643e2c882053657420737469636b696564207468726561647320666f722063617465676f72790024203c7765696768743e0028202323205765696768744c20604f202857202b205629602077686572653a74202d20605760206973207468652063617465676f72792064657074682ca0202d2060566020697320746865206c656e677468206f662074686520737469636b6965645f69647318202d2044423a38202020202d204f2857202b205629302023203c2f7765696768743e014c3c43617465676f727943726561746564102843617465676f72794964484f7074696f6e3c43617465676f727949643e1c5665633c75383e1c5665633c75383e046820412063617465676f72792077617320696e74726f64756365647443617465676f7279417263686976616c537461747573557064617465640c2843617465676f7279496410626f6f6c3c50726976696c656765644163746f7208e420416e206172686963616c20737461747573206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e190120546865207365636f6e6420617267756d656e74207265666c6563747320746865206e657720617263686976616c20737461747573206f66207468652063617465676f72792e5043617465676f72795469746c65557064617465640c2843617465676f7279496410486173683c50726976696c656765644163746f7208bc2041207469746c65206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e050120546865207365636f6e6420617267756d656e74207265666c6563747320746865206e6577207469746c652068617368206f66207468652063617465676f72792e6843617465676f72794465736372697074696f6e557064617465640c2843617465676f7279496410486173683c50726976696c656765644163746f7208d42041206469736372697074696f6e206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e1d0120546865207365636f6e6420617267756d656e74207265666c6563747320746865206e6577206465736372697074696f6e2068617368206f66207468652063617465676f72792e3c43617465676f727944656c65746564082843617465676f727949643c50726976696c656765644163746f72045c20412063617465676f7279207761732064656c6574656434546872656164437265617465641c2843617465676f7279496420546872656164496418506f737449642c466f72756d5573657249641c5665633c75383e1c5665633c75383e444f7074696f6e3c506f6c6c496e7075743e0890204120746872656164207769746820676976656e2069642077617320637265617465642ef4204120746869726420617267756d656e74207265666c656374732074686520696e697469616c20706f7374206964206f6620746865207468726561642e3c5468726561644d6f64657261746564102054687265616449641c5665633c75383e3c50726976696c656765644163746f722843617465676f727949640498204120746872656164207769746820676976656e20696420776173206d6f646572617465642e34546872656164557064617465641020546872656164496410626f6f6c3c50726976696c656765644163746f722843617465676f727949640890204120746872656164207769746820676976656e2069642077617320757064617465642e110120546865207365636f6e6420617267756d656e74207265666c6563747320746865206e657720617263686976616c20737461747573206f6620746865207468726561642e545468726561644d6574616461746155706461746564102054687265616449642c466f72756d5573657249642843617465676f727949641c5665633c75383e04a0204120746872656164206d6574616461746120676976656e2069642077617320757064617465642e3454687265616444656c65746564102054687265616449642c466f72756d5573657249642843617465676f7279496410626f6f6c0458204120746872656164207761732064656c657465642e2c5468726561644d6f766564102054687265616449642843617465676f727949643c50726976696c656765644163746f722843617465676f72794964048c20412074687265616420776173206d6f76656420746f206e65772063617465676f727924506f737441646465641818506f737449642c466f72756d5573657249642843617465676f727949642054687265616449641c5665633c75383e10626f6f6c048020506f7374207769746820676976656e2069642077617320637265617465642e34506f73744d6f646572617465641418506f737449641c5665633c75383e3c50726976696c656765644163746f722843617465676f72794964205468726561644964048820506f73742077697468206769766e6520696420776173206d6f646572617465642e2c506f737444656c657465640c1c5665633c75383e2c466f72756d5573657249647842547265654d61703c457874656e646564506f737449642c20626f6f6c3e048020506f73742077697468206769766e65206964207761732064656c657465642e3c506f737454657874557064617465641418506f737449642c466f72756d5573657249642843617465676f727949642054687265616449641c5665633c75383e08a420506f7374207769746820676976656e2069642068616420697473207465787420757064617465642e510120546865207365636f6e6420617267756d656e74207265666c6563747320746865206e756d626572206f6620746f74616c206564697473207768656e20746865207465787420757064617465206f63637572732e2c506f737452656163746564142c466f72756d55736572496418506f7374496438506f73745265616374696f6e49642843617465676f727949642054687265616449640438205468756d6220757020706f737428566f74654f6e506f6c6c102054687265616449640c7533322c466f72756d5573657249642843617465676f72794964043420566f7465206f6e20706f6c6c6843617465676f7279537469636b795468726561645570646174650c2843617465676f72794964345665633c54687265616449643e3c50726976696c656765644163746f72048c20537469636b7920746872656164207570646174656420666f722063617465676f72799043617465676f72794d656d626572736869704f664d6f64657261746f72557064617465640c2c4d6f64657261746f7249642843617465676f7279496410626f6f6c04290120416e206d6f64657261746f72206162696c69747920746f206d6f64657261746520612063617465676f727920616e64206974732073756263617465676f726965732075706461746564102c506f73744465706f7369743042616c616e63654f663c543e400a0000000000000000000000000000000838204578706f72747320636f6e737480204465706f736974206e656564656420746f20637265617465206120706f7374345468726561644465706f7369743042616c616e63654f663c543e401e0000000000000000000000000000000488204465706f736974206e656564656420746f20637265617465206120746872656164404d617853756263617465676f726965730c7536342028000000000000000444204d617853756263617465676f72696573344d617843617465676f726965730c7536342028000000000000000438204d617843617465676f7269657380484f726967696e4e6f74466f72756d4c65616404b8204f726967696e20646f65736e277420636f72726573706f6e6420746f20616e79206c656164206163636f756e7468466f72756d5573657249644e6f744d617463684163636f756e74049420466f72756d2075736572206964206e6f74206d6174636820697473206163636f756e742e684d6f64657261746f7249644e6f744d617463684163636f756e740490204d6f64657261746f72206964206e6f74206d6174636820697473206163636f756e742e7c4163636f756e74446f65734e6f744d61746368546872656164417574686f72049c20546872656164206e6f7420617574686f7265642062792074686520676976656e20757365722e48546872656164446f65734e6f74457869737404582054687265616420646f6573206e6f742065786973747c4d6f64657261746f724d6f6465726174654f726967696e43617465676f727904d4204d6f64657261746f722063616e2774206d6f6465726174652063617465676f727920636f6e7461696e696e67207468726561642e904d6f64657261746f724d6f64657261746544657374696e6174696f6e43617465676f727904bc204d6f64657261746f722063616e2774206d6f6465726174652064657374696e6174696f6e2063617465676f72792e445468726561644d6f7665496e76616c6964049c204f726967696e206973207468652073616d65206173207468652064657374696e6174696f6e2e545468726561644e6f744265696e6755706461746564046820546872656164206e6f74206265696e6720757064617465642e90496e73756666696369656e7442616c616e6365466f725468726561644372656174696f6e0490204e6f7420656e6f7567682062616c616e636520746f206372656174652074687265616440506f7374446f65734e6f744578697374045420506f737420646f6573206e6f742065786973742e744163636f756e74446f65734e6f744d61746368506f7374417574686f720490204163636f756e7420646f6573206e6f74206d6174636820706f737420617574686f722e68496e73756666696369656e7442616c616e6365466f72506f7374046c204e6f7420656e6f7567682062616c616e636520746f20706f73745c43617465676f72794e6f744265696e675570646174656404702043617465676f7279206e6f74206265696e6720757064617465642e64416e636573746f7243617465676f7279496d6d757461626c6504d820416e636573746f722063617465676f727920696d6d757461626c652c20692e652e2064656c65746564206f72206172636869766564744d617856616c696443617465676f727944657074684578636565646564049c204d6178696d756d2076616c69642063617465676f72792064657074682065786365656465642e5043617465676f7279446f65734e6f74457869737404642043617465676f727920646f6573206e6f742065786973742e7443617465676f72794d6f64657261746f72446f65734e6f74457869737404cc2050726f7669646564206d6f64657261746f72206973206e6f7420676976656e2063617465676f7279206d6f64657261746f725c43617465676f72794e6f74456d7074795468726561647304982043617465676f7279207374696c6c20636f6e7461696e7320736f6d6520746872656164732e6843617465676f72794e6f74456d70747943617465676f7269657304b02043617465676f7279207374696c6c20636f6e7461696e7320736f6d652073756263617465676f726965732e6c4d6f64657261746f7243616e7444656c65746543617465676f7279048c204e6f207065726d697373696f6e7320746f2064656c6574652063617465676f72792e6c4d6f64657261746f7243616e7455706461746543617465676f7279048c204e6f207065726d697373696f6e7320746f207570646174652063617465676f72792e6c537469636b6965645468726561644964734475706c69636174657304c8204475706c69636174657320666f722074686520737469636b6965642074687265616420696420636f6c6c656374696f6e2e60506f6c6c416c7465726e617469766573546f6f53686f7274047420506f6c6c206974656d73206e756d62657220746f6f2073686f72742e30506f6c6c4e6f744578697374044020506f6c6c206e6f742065786973742e3c506f6c6c54696d6553657474696e67047020506f6c6c20646174652073657474696e672069732077726f6e672e20506f6c6c44617461047820506f6c6c206461746120636f6d6d69747465642069732077726f6e672e44506f6c6c436f6d6d69744578706972656404a020506f6c6c206461746120636f6d6d697474656420616674657220706f6c6c20657870697265642e48416c7265616479566f7465644f6e506f6c6c047820466f72756d20757365722068617320616c726561647920766f7465642e50446174614d6967726174696f6e4e6f74446f6e6504742064617461206d6967726174696f6e206e6f7420646f6e65207965742e304d617053697a654c696d69740494204d6178696d756d2073697a65206f662073746f72616765206d617020657863656564656484506174684c656e67746853686f756c644265477265617465725468616e5a65726f04b82043617465676f72792070617468206c656e2073686f756c642062652067726561746572207468616e207a65726f1430436f6e737469747574696f6e0130436f6e737469747574696f6e0430436f6e737469747574696f6e010040436f6e737469747574696f6e496e666f040000010448616d656e645f636f6e737469747574696f6e0444636f6e737469747574696f6e5f746578741c5665633c75383e18e82053657473207468652063757272656e7420636f6e737469747574696f6e20686173682e20526571756972657320726f6f74206f726967696e2e2c2023203c7765696768743e1501202d20436f6d706c65786974793a20604f28432960207768657265204320697320746865206c656e677468206f662074686520636f6e737469747574696f6e20746578742e38202d2044622072656164733a203080202d204462207772697465733a20312028636f6e7374616e742076616c756529302023203c2f7765696768743e010444436f6e73747574696f6e416d656e646564081c5665633c75383e1c5665633c75383e108420456d697473206f6e20636f6e737469747574696f6e20616d656e646d656e742e3020506172616d65746572733a64202d20636f6e737469747574696f6e2074657874206861736850202d20636f6e737469747574696f6e207465787400001518426f756e74790118426f756e74791420426f756e746965730101022c543a3a426f756e7479496424426f756e74793c543e0059010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044020426f756e74792073746f726167652e4c426f756e7479436f6e747269627574696f6e730102022c543a3a426f756e7479496460426f756e74794163746f723c4d656d62657249643c543e3e3042616c616e63654f663c543e024000000000000000000000000000000000044d0120446f75626c65206d617020666f7220626f756e74792066756e64696e672e2049742073746f7265732061206d656d626572206f7220636f756e63696c2066756e64696e6720666f7220626f756e746965732e2c426f756e7479436f756e7401000c753332100000000004b820436f756e74206f6620616c6c20626f756e7469657320746861742068617665206265656e20637265617465642e1c456e74726965730102022c543a3a426f756e7479496428543a3a456e747279496420456e7472793c543e02b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046020576f726b20656e7472792073746f72616765206d61702e28456e747279436f756e7401000c753332100000000004c820436f756e74206f6620616c6c20776f726b20656e747269657320746861742068617665206265656e20637265617465642e0138346372656174655f626f756e74790818706172616d736c426f756e74794372656174696f6e506172616d65746572733c543e206d657461646174611c5665633c75383e284d012043726561746573206120626f756e74792e204d657461646174612073746f72656420696e20746865207472616e73616374696f6e206c6f67206275742064697363617264656420616674657220746861742e24203c7765696768743e0028202323205765696768743c20604f20285729602077686572653a7c202d2060576020697320746865205f6d65746164617461206c656e6774682eb4202d20604d6020697320636c6f73656420636f6e7472616374206d656d626572206c697374206c656e6774682e18202d2044423a88202020202d204f284d2920284f283129206f6e206f70656e20636f6e747261637429302023203c2f7765696768743e3463616e63656c5f626f756e7479081c63726561746f7260426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e7479496424482043616e63656c73206120626f756e74792ecc2049742072657475726e7320612063686572727920746f2063726561746f7220616e642072656d6f76657320626f756e74792e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c7665746f5f626f756e74790424626f756e74795f69642c543a3a426f756e747949642444205665746f6573206120626f756e74792ecc2049742072657475726e7320612063686572727920746f2063726561746f7220616e642072656d6f76657320626f756e74792e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c66756e645f626f756e74790c1866756e64657260426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e7479496418616d6f756e743042616c616e63654f663c543e20642050726f766964657320626f756e74792066756e64696e672e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4077697468647261775f66756e64696e67081866756e64657260426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e7479496420c820576974686472617720626f756e74792066756e64696e672062792061206d656d626572206f72206120636f756e63696c2e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c616e6e6f756e63655f776f726b5f656e7472790c246d656d6265725f69642c4d656d62657249643c543e24626f756e74795f69642c543a3a426f756e74794964487374616b696e675f6163636f756e745f696430543a3a4163636f756e74496420b420416e6e6f756e636520776f726b20656e74727920666f722061207375636365737366756c20626f756e74792e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c77697468647261775f776f726b5f656e7472790c246d656d6265725f69642c4d656d62657249643c543e24626f756e74795f69642c543a3a426f756e7479496420656e7472795f696428543a3a456e747279496420350120576974686472617720776f726b20656e74727920666f72206120626f756e74792e204578697374696e67207374616b6520636f756c64206265207061727469616c6c7920736c61736865642e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c7375626d69745f776f726b10246d656d6265725f69642c4d656d62657249643c543e24626f756e74795f69642c543a3a426f756e7479496420656e7472795f696428543a3a456e747279496424776f726b5f646174611c5665633c75383e2468205375626d697420776f726b20666f72206120626f756e74792e2c2023203c7765696768743e0028202323207765696768742020604f20284e29607c202d20604e602069732074686520776f726b5f64617461206c656e6774682c18202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e587375626d69745f6f7261636c655f6a7564676d656e7410186f7261636c6560426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e74794964206a7564676d656e74a04f7261636c654a7564676d656e743c543a3a456e74727949642c2042616c616e63654f663c543e3e24726174696f6e616c651c5665633c75383e24a4205375626d69747320616e206f7261636c65206a7564676d656e7420666f72206120626f756e74792e2c2023203c7765696768743e0028202323207765696768742020604f20284e29607c202d20604e602069732074686520776f726b5f64617461206c656e6774682c18202d2064623a30202020202d20604f284e2960302023203c2f7765696768743e6c77697468647261775f776f726b5f656e7472616e745f66756e64730c246d656d6265725f69642c4d656d62657249643c543e24626f756e74795f69642c543a3a426f756e7479496420656e7472795f696428543a3a456e7472794964287420576974686472617720776f726b20656e7472616e742066756e64732e590120426f7468206c65676974696d617465207061727469636970616e747320616e642077696e6e65727320676574207468656972207374616b6520756e6c6f636b65642e2057696e6e65727320616c736f2067657420613c20626f756e7479207265776172642e2c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e48636f6e7472696275746f725f72656d61726b0c2c636f6e7472696275746f7260426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e747949640c6d73671c5665633c75383e248420426f756e747920436f6e7472696275746f72206d61646520612072656d61726b002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e346f7261636c655f72656d61726b0c186f7261636c6560426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e747949640c6d73671c5665633c75383e247020426f756e7479204f7261636c65206d61646520612072656d61726b002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38656e7472616e745f72656d61726b1028656e7472616e745f69642c4d656d62657249643c543e24626f756e74795f69642c543a3a426f756e7479496420656e7472795f696428543a3a456e74727949640c6d73671c5665633c75383e249020426f756e747920456e7472616e7420576f726b6572206d61646520612072656d61726b002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863726561746f725f72656d61726b0c1c63726561746f7260426f756e74794163746f723c4d656d62657249643c543e3e24626f756e74795f69642c543a3a426f756e747949640c6d73671c5665633c75383e247020426f756e7479204f7261636c65206d61646520612072656d61726b002c2023203c7765696768743e0028202323207765696768742020604f202831296018202d2064623ad8202020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e014834426f756e7479437265617465640c20426f756e7479496460426f756e74794372656174696f6e506172616d65746572731c5665633c75383e1458204120626f756e74792077617320637265617465642e2020506172616d733a30202d20626f756e747920494458202d206372656174696f6e20706172616d657465727348202d20626f756e7479206d6574616461746138426f756e747943616e63656c65640820426f756e7479496454426f756e74794163746f723c4d656d62657249643e105c204120626f756e7479207761732063616e63656c65642e2020506172616d733a30202d20626f756e747920494444202d20626f756e74792063726561746f7230426f756e74795665746f65640420426f756e747949640c54204120626f756e747920776173207665746f65642e2020506172616d733a30202d20626f756e747920494430426f756e747946756e6465640c20426f756e7479496454426f756e74794163746f723c4d656d62657249643e1c42616c616e636514b8204120626f756e7479207761732066756e6465642062792061206d656d626572206f72206120636f756e63696c2e2020506172616d733a30202d20626f756e747920494440202d20626f756e74792066756e64657244202d2066756e64696e6720616d6f756e745c426f756e74794d617846756e64696e67526561636865640420426f756e747949640cc4204120626f756e747920686173207265616368656420697473206d6178696d756d2066756e64696e6720616d6f756e742e2020506172616d733a30202d20626f756e74792049445c426f756e747946756e64696e675769746864726177616c0820426f756e7479496454426f756e74794163746f723c4d656d62657249643e10c42041206d656d626572206f72206120636f756e63696c206861732077697468647261776e207468652066756e64696e672e2020506172616d733a30202d20626f756e747920494440202d20626f756e74792066756e64657274426f756e747943726561746f724368657272795769746864726177616c0820426f756e7479496454426f756e74794163746f723c4d656d62657249643e10fc204120626f756e74792063726561746f72206861732077697468647261776e207468652063686572727920286d656d626572206f7220636f756e63696c292e2020506172616d733a30202d20626f756e747920494444202d20626f756e74792063726561746f7234426f756e747952656d6f7665640420426f756e747949640c58204120626f756e7479207761732072656d6f7665642e2020506172616d733a30202d20626f756e747920494448576f726b456e747279416e6e6f756e6365641020426f756e747949641c456e7472794964204d656d6265724964244163636f756e744964186820576f726b20656e7472792077617320616e6e6f756e6365642e2020506172616d733a30202d20626f756e74792049444c202d206372656174656420656e74727920494450202d20656e7472616e74206d656d62657220494454202d207374616b696e67206163636f756e7420494448576f726b456e74727957697468647261776e0c20426f756e747949641c456e7472794964204d656d6265724964146820576f726b20656e747279207761732077697468647261776e2e2020506172616d733a30202d20626f756e74792049442c202d20656e74727920494450202d20656e7472616e74206d656d62657220494440576f726b456e747279536c61736865640820426f756e747949641c456e7472794964106020576f726b20656e7472792077617320736c61736865642e2020506172616d733a30202d20626f756e74792049442c202d20656e74727920494434576f726b5375626d69747465641020426f756e747949641c456e7472794964204d656d62657249641c5665633c75383e1834205375626d697420776f726b2e2020506172616d733a30202d20626f756e74792049444c202d206372656174656420656e74727920494450202d20656e7472616e74206d656d626572204944ac202d20776f726b206461746120286465736372697074696f6e2c2055524c2c20424c4f422c206574632e295c4f7261636c654a7564676d656e745375626d69747465641020426f756e7479496454426f756e74794163746f723c4d656d62657249643e384f7261636c654a7564676d656e741c5665633c75383e1860205375626d6974206f7261636c65206a7564676d656e742e2020506172616d733a30202d20626f756e747920494424202d206f7261636c6540202d206a7564676d656e74206461746130202d20726174696f6e616c6564576f726b456e7472616e7446756e647357697468647261776e0c20426f756e747949641c456e7472794964204d656d6265724964146020576f726b20656e7472792077617320736c61736865642e2020506172616d733a30202d20626f756e74792049442c202d20656e74727920494450202d20656e7472616e74206d656d62657220494464426f756e7479436f6e7472696275746f7252656d61726b65640c54426f756e74794163746f723c4d656d62657249643e20426f756e747949641c5665633c75383e14a420426f756e747920636f6e7472696275746f72206d6164652061206d6573736167652072656d61726b2020506172616d733a38202d20636f6e7472696275746f7230202d20626f756e747920696428202d206d65737361676550426f756e74794f7261636c6552656d61726b65640c54426f756e74794163746f723c4d656d62657249643e20426f756e747949641c5665633c75383e149020426f756e7479206f7261636c65206d6164652061206d6573736167652072656d61726b2020506172616d733a24202d206f7261636c6530202d20626f756e747920696428202d206d65737361676554426f756e7479456e7472616e7452656d61726b656410204d656d626572496420426f756e747949641c456e74727949641c5665633c75383e189420426f756e747920656e7472616e74206d6164652061206d6573736167652072656d61726b2020506172616d733a34202d20656e7472616e745f696430202d20626f756e74792069642c202d20656e74727920696428202d206d65737361676554426f756e747943726561746f7252656d61726b65640c54426f756e74794163746f723c4d656d62657249643e20426f756e747949641c5665633c75383e149420426f756e747920656e7472616e74206d6164652061206d6573736167652072656d61726b2020506172616d733a28202d2063726561746f7230202d20626f756e747920696428202d206d657373616765145c436c6f736564436f6e747261637453697a654c696d69740c7533321032000000044d01204578706f72747320636f6e7374202d206d617820776f726b20656e747279206e756d62657220666f72206120636c6f736564206173737572616e6365207479706520636f6e747261637420626f756e74792e384d696e4368657272794c696d69743042616c616e63654f663c543e40e803000000000000000000000000000004d4204578706f72747320636f6e7374202d206d696e206368657272792076616c7565206c696d697420666f72206120626f756e74792e3c4d696e46756e64696e674c696d69743042616c616e63654f663c543e40e803000000000000000000000000000004dc204578706f72747320636f6e7374202d206d696e2066756e64696e6720616d6f756e74206c696d697420666f72206120626f756e74792e4c4d696e576f726b456e7472616e745374616b653042616c616e63654f663c543e40e803000000000000000000000000000004d4204578706f72747320636f6e7374202d206d696e20776f726b20656e7472616e74207374616b6520666f72206120626f756e74792e30426f756e74794c6f636b4964384c6f636b4964656e74696669657220626f756e747920200480204578706f72747320636f6e7374202d20626f756e7479206c6f636b2069642e94b04d696e46756e64696e67416d6f756e7443616e6e6f744265477265617465725468616e4d6178416d6f756e7404d8204d696e2066756e64696e6720616d6f756e742063616e6e6f742062652067726561746572207468616e206d617820616d6f756e742e44426f756e7479446f65736e744578697374045420426f756e747920646f65736e742065786973742e384e6f74426f756e74794163746f7204d4204f7065726174696f6e2063616e20626520706572666f726d6564206f6e6c79206279206120626f756e74792063726561746f722e58576f726b506572696f6443616e6e6f7442655a65726f047020576f726b20706572696f642063616e6e6f74206265207a65726f2e644a756467696e67506572696f6443616e6e6f7442655a65726f047c204a756467696e6720706572696f642063616e6e6f74206265207a65726f2e74496e76616c69645374616765556e657870656374656446756e64696e6704cc20556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a2046756e64696e672e90496e76616c69645374616765556e657870656374656446756e64696e674578706972656404e820556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a2046756e64696e67457870697265642e90496e76616c69645374616765556e6578706563746564576f726b5375626d697373696f6e04e820556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a20576f726b5375626d697373696f6e2e78496e76616c69645374616765556e65787065637465644a7564676d656e7404d020556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a204a7564676d656e742ec0496e76616c69645374616765556e65787065637465645375636365737366756c426f756e74795769746864726177616c04190120556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a205375636365737366756c426f756e74795769746864726177616c2eb0496e76616c69645374616765556e65787065637465644661696c6564426f756e74795769746864726177616c04090120556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a204661696c6564426f756e74795769746864726177616c2e70496e73756666696369656e7442616c616e6365466f72426f756e747904a820496e73756666696369656e742062616c616e636520666f72206120626f756e7479206368657272792e5c46756e64696e67506572696f644e6f744578706972656404b82046756e64696e6720706572696f64206973206e6f74206578706972656420666f722074686520626f756e74792e644e6f426f756e7479436f6e747269627574696f6e466f756e6404882043616e6e6f7420666f756e6420626f756e747920636f6e747269627574696f6e2e444e6f7468696e67546f57697468647261770478205468657265206973206e6f7468696e6720746f2077697468647261772e445a65726f46756e64696e67416d6f756e74046820496e636f72726563742066756e64696e6720616d6f756e742e6c496e73756666696369656e7442616c616e6365466f725374616b6504a4205468657265206973206e6f7420656e6f7567682062616c616e636520666f722061207374616b652e44436f6e666c696374696e675374616b657304c02054686520636f6e666c696374696e67207374616b6520646973636f76657265642e2043616e6e6f74207374616b652e50576f726b456e747279446f65736e744578697374046420576f726b20656e74727920646f65736e742065786973742e604d6178576f726b456e7472794c696d69745265616368656404b02043616e6e6f742061646420776f726b20656e7472792062656361757365206f6620746865206c696d69742e704368657272794c6573735468656e4d696e696d756d416c6c6f776564048820436865727279206c657373207468656e206d696e696d756d20616c6c6f7765642e7446756e64696e674c6573735468656e4d696e696d756d416c6c6f77656404a82046756e64696e6720616d6f756e74206c657373207468656e206d696e696d756d20616c6c6f7765642e9843616e6e6f745375626d6974576f726b546f436c6f736564436f6e7472616374426f756e747908550120496e636f6d70617469626c65206173737572616e636520636f6e7472616374207479706520666f722061206d656d6265723a2063616e6e6f74207375626d697420776f726b20746f207468652027636c6f73656470206173737572616e63652720626f756e747920636f6e74726163742e7c436c6f736564436f6e74726163744d656d6265724c6973744973456d707479042d012043616e6e6f742063726561746520612027636c6f736564206173737572616e636520636f6e74726163742720626f756e7479207769746820656d707479206d656d626572206c6973742e88436c6f736564436f6e74726163744d656d6265724c6973744973546f6f4c61726765082d012043616e6e6f742063726561746520612027636c6f736564206173737572616e636520636f6e74726163742720626f756e74792077697468206d656d626572206c697374206c61726765728c207468616e20616c6c6f776564206d617820776f726b20656e747279206c696d69742e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e405a65726f57696e6e657252657761726404902043616e6e6f7420736574207a65726f2072657761726420666f722077696e6e6572732e98546f74616c52657761726453686f756c644265457175616c546f546f74616c46756e64696e670419012054686520746f74616c2072657761726420666f722077696e6e6572732073686f756c6420626520657175616c20746f20746f74616c20626f756e74792066756e64696e672e74456e7472616e745374616b6549734c6573735468616e4d696e696e756d0431012043616e6e6f7420637265617465206120626f756e7479207769746820616e20656e7472616e74207374616b65206973206c657373207468616e207265717569726564206d696e696d756d2e6446756e64696e67416d6f756e7443616e6e6f7442655a65726f04ec2043616e6e6f7420637265617465206120626f756e74792077697468207a65726f2066756e64696e6720616d6f756e7420706172616d657465722e6446756e64696e67506572696f6443616e6e6f7442655a65726f04ec2043616e6e6f7420637265617465206120626f756e74792077697468207a65726f2066756e64696e6720706572696f6420706172616d657465722e4c4e6f416374697665576f726b456e74726965730851012043616e6e6f74207375626d69742061206a7564676d656e7420776974686f75742061637469766520776f726b20656e74726965732e20412070726f6261626c65206361736520666f7220616e206572726f723af820616e20656e747279207769746820612073696e676c65207375626d697373696f6e20666f72206120626f756e7479207761732077697468647261776e2e7457696e6e657253686f756c64486173576f726b5375626d697373696f6e04f420496e76616c6964206a7564676d656e74202d20616c6c2077696e6e6572732073686f756c64206861766520776f726b207375626d697373696f6e732e80496e76616c6964436f6e7472696275746f724163746f72537065636966696564047420426f756e747920636f6e7472696275746f72206e6f7420666f756e646c496e76616c69644f7261636c654163746f72537065636966696564046020426f756e7479206f7261636c65206e6f7420666f756e6474496e76616c6964456e7472616e74576f726b657253706563696669656404a8204d656d62657220737065636966696564206973206e6f7420616e20656e7472616e7420776f726b657270496e76616c696443726561746f724163746f7253706563696669656404ac20496e76616c69642043726561746f72204163746f7220666f7220426f756e7479207370656369666965641610426c6f67014c496e7374616e636531426c6f674d6f64756c650c24506f7374436f756e74010018506f73744964200000000000000000086d01204d6170732c20726570726573656e74696e67206964203d3e206974656d2072656c6174696f6e7368697020666f7220626c6f67732c20706f73747320616e64207265706c6965732072656c6174656420737472756374757265732c20506f737420636f756e7420506f73744279496401010218506f7374496428506f73743c542c20493e0025010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b020506f737420627920756e6971756520626c6f6720616e6420706f7374206964656e746966696361746f7273245265706c794279496401020218506f7374496428543a3a5265706c7949642c5265706c793c542c20493e02150100000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000004d0205265706c7920627920756e6971756520626c6f672c20706f737420616e64207265706c79206964656e746966696361746f7273011c2c6372656174655f706f737408147469746c651c5665633c75383e10626f64791c5665633c75383e2c490120426c6f67206f776e65722063616e2063726561746520706f7374732c2072656c6174656420746f206120676976656e20626c6f672c2069662072656c6174656420626c6f6720697320756e6c6f636b65640024203c7765696768743e0028202323205765696768744c20604f202854202b204229602077686572653a84202d2060546020697320746865206c656e677468206f6620746865207469746c6580202d2060426020697320746865206c656e677468206f662074686520626f647918202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e246c6f636b5f706f7374041c706f73745f696418506f7374496428d020426c6f67206f776e65722063616e206c6f636b20706f7374732c2072656c6174656420746f206120676976656e20626c6f672c3101206d616b696e6720706f737420696d6d757461626c6520746f20616e7920616374696f6e7320287265706c696573206372656174696f6e2c20706f73742065646974696e672c206574632e290024203c7765696768743e002820232320576569676874cc20604f202831296020646f65736e277420646570656e6473206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c756e6c6f636b5f706f7374041c706f73745f696418506f7374496428d820426c6f67206f776e65722063616e20756e6c6f636b20706f7374732c2072656c6174656420746f206120676976656e20626c6f672cd8206d616b696e6720706f737420616363657369626c6520746f2070726576696f75736c7920666f7262696464656e20616374696f6e730024203c7765696768743e002820232320576569676874cc20604f202831296020646f65736e277420646570656e6473206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e24656469745f706f73740c1c706f73745f696418506f73744964246e65775f7469746c653c4f7074696f6e3c5665633c75383e3e206e65775f626f64793c4f7074696f6e3c5665633c75383e3e2c010120426c6f67206f776e65722063616e206564697420706f73742c2072656c6174656420746f206120676976656e20626c6f672028696620756e6c6f636b6564297420776974682061206e6577207469746c6520616e642f6f7220626f647924203c7765696768743e0028202323205765696768744c20604f202854202b204229602077686572653a9c202d2060546020697320746865206c656e677468206f662074686520606e65775f7469746c656098202d2060426020697320746865206c656e677468206f662074686520606e65775f626f64796018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e306372656174655f7265706c7914387061727469636970616e745f6964405061727469636970616e7449643c543e1c706f73745f696418506f73744964207265706c795f6964484f7074696f6e3c543a3a5265706c7949643e10746578741c5665633c75383e206564697461626c6510626f6f6c28dc204372656174652065697468657220726f6f7420706f7374207265706c79206f7220646972656374207265706c7920746f207265706c79e420284f6e6c792061636365737369626c652c2069662072656c6174656420626c6f6720616e6420706f73742061726520756e6c6f636b65642924203c7765696768743e0028202323205765696768743c20604f20285429602077686572653a88202d2060546020697320746865206c656e677468206f66207468652060746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e28656469745f7265706c7910387061727469636970616e745f6964405061727469636970616e7449643c543e1c706f73745f696418506f73744964207265706c795f696428543a3a5265706c794964206e65775f746578741c5665633c75383e2cac205265706c79206f776e65722063616e2065646974207265706c7920776974682061206e65772074657874e420284f6e6c792061636365737369626c652c2069662072656c6174656420626c6f6720616e6420706f73742061726520756e6c6f636b6564290024203c7765696768743e0028202323205765696768743c20604f20285429602077686572653a98202d2060546020697320746865206c656e677468206f662074686520606e65775f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656c6574655f7265706c69657308387061727469636970616e745f6964405061727469636970616e7449643c543e1c7265706c696573785665633c5265706c79546f44656c6574653c543a3a5265706c7949643e3e28682052656d6f7665207265706c792066726f6d2073746f726167650024203c7765696768743e0028202323205765696768743820604f2028522960207768657265ac202d205220697320746865206e756d626572206f66207265706c69657320746f2062652064656c6574656418202d2044423a28202020202d204f285229302023203c2f7765696768743e01202c506f7374437265617465640c18506f73744964145469746c651054657874044c204120706f737420776173206372656174656428506f73744c6f636b65640418506f737449640448204120706f737420776173206c6f636b656430506f7374556e6c6f636b65640418506f737449640450204120706f73742077617320756e6c6f636b656428506f73744564697465640c18506f7374496430557064617465645469746c652c55706461746564426f64790448204120706f73742077617320656469746564305265706c794372656174656414345061727469636970616e74496418506f737449641c5265706c794964105465787410626f6f6c04782041207265706c7920746f206120706f7374207761732063726561746564484469726563745265706c794372656174656418345061727469636970616e74496418506f737449641c5265706c7949641c5265706c794964105465787410626f6f6c047c2041207265706c7920746f2061207265706c79207761732063726561746564305265706c7944656c6574656410345061727469636970616e74496418506f737449641c5265706c79496410626f6f6c04842041207265706c79207761732064656c657465642066726f6d2073746f726167652c5265706c7945646974656410345061727469636970616e74496418506f737449641c5265706c7949641054657874044c2041207265706c792077617320656469746564002848426c6f674f776e6572736869704572726f7204cc2041206e6f6e2d6f776e657220697320747279696e6720746f20646f20612070726976696c65676564656420616374696f6e2e3c4d656d626572736869704572726f7204982041206e6f6e2d6d656d62657220697320747279696e6720746f20706172746963697061746530506f73744e6f74466f756e64045020506f737420646f206e6f74206578697374732e3c506f73744c6f636b65644572726f72048820506f7374206973206c6f636b656420666f72206d6f64696669636174696f6e732e345265706c794e6f74466f756e640450205265706c7920646f206e6f206578697374732e4c5265706c794f776e6572736869704572726f7204f02041206e6f6e2d6f776e6572206f662061207265706c7920697320747279696e6720746f20646f20612070726976696c6567656420616374696f6e2e40506f73744c696d6974526561636865640480204e756d626572206f6620706f7374732065786365656473206c696d6974732e50496e76616c69645265616374696f6e496e6465780460205265616374696f6e20646f65736e2774206578697374736c496e73756666696369656e7442616c616e6365466f725265706c79049c20496e737566696369656e742062616c616e636520666f72207265706c79206372656174696f6e80496e73756666696369656e7442616c616e6365496e506f73744163636f756e740845012054686973206572726f7220726570726573656e742074686520696e76616c6964207374617465207768657265207468657265206973206e6f7420656e6f7567682066756e647320696e206120706f737478206163636f756e7420746f20706179206f6666206974732064656c65746517404a6f7973747265616d5574696c6974790001105c657865637574655f7369676e616c5f70726f706f73616c04187369676e616c1c5665633c75383e287501205369676e616c2070726f706f73616c2065787472696e7369632e2053686f756c6420626520757365642061732063616c6c61626c65206f626a65637420746f207061737320746f207468652060656e67696e6560206d6f64756c652e0024203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a88202d2060536020697320746865206c656e677468206f6620746865207369676e616c18202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e80657865637574655f72756e74696d655f757067726164655f70726f706f73616c04107761736d1c5665633c75383e24902052756e74696d6520757067726164652070726f706f73616c2065787472696e7369632e09012053686f756c6420626520757365642061732063616c6c61626c65206f626a65637420746f207061737320746f207468652060656e67696e6560206d6f64756c652e24203c7765696768743e0028202323205765696768743c20604f20284329602077686572653a78202d2060436020697320746865206c656e677468206f6620607761736d60410120486f77657665722c207765207472656174207468697320617320612066756c6c20626c6f636b20617320606672616d655f73797374656d3a3a4d6f64756c653a3a7365745f636f64656020646f6573302023203c2f7765696768743e6c7570646174655f776f726b696e675f67726f75705f6275646765740c34776f726b696e675f67726f757030576f726b696e6747726f757018616d6f756e743042616c616e63654f663c543e3062616c616e63655f6b696e642c42616c616e63654b696e6420702055706461746520776f726b696e672067726f75702062756467657424203c7765696768743e002820232320576569676874c820604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c6275726e5f6163636f756e745f746f6b656e730418616d6f756e743042616c616e63654f663c543e207c204275726e7320746f6b656e20666f722063616c6c6572206163636f756e7424203c7765696768743e002820232320576569676874c820604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0110205369676e616c6564041c5665633c75383e0c7c2041207369676e616c2070726f706f73616c207761732065786563757465642020506172616d733ae0202d205369676e616c20676976656e207768656e206372656174696e672074686520636f72726573706f6e64696e672070726f706f73616c3c52756e74696d655570677261646564041c5665633c75383e0c7c20412072756e74696d652075706772616465207761732065786563757465642020506172616d733a70202d204e657720636f646520656e636f64656420696e2062797465736455706461746564576f726b696e6747726f75704275646765740c30576f726b696e6747726f75701c42616c616e63652c42616c616e63654b696e6418dc20416e206055706461746520576f726b696e672047726f757020427564676574602070726f706f73616c207761732065786563757465642020506172616d733ab8202d20576f726b696e672067726f757020776869636820627564676574206973206265696e67207570646174656480202d20416d6f756e74206f662062616c616e6365206265696e67206d6f7665646101202d20456e756d2076617269616e74207769746820706f73697469766520696e6469636174696e672066756e6473206d6f76656420746f72776172647320776f726b696e672067726f757020616e64206e65676174697665c420616e64206e656761746976652066756e6473206d6f76696e672066726f6d2074686520776f726b696e672067726f757030546f6b656e734275726e656408244163636f756e7449641c42616c616e6365106420416e206163636f756e74206275726e656420746f6b656e732020506172616d733a8c202d204163636f756e74204964206f6620746865206275726e696e6720746f6b656e738c202d2042616c616e6365206275726e65642066726f6d2074686174206163636f756e74000c80496e73756666696369656e7446756e6473466f7242756467657455706461746504210120496e73756666696369656e742066756e647320666f72202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20657865637574696f6e385a65726f546f6b656e734275726e046c20547279696e6720746f206275726e207a65726f20746f6b656e7360496e73756666696369656e7446756e6473466f724275726e047c20496e73756666696369656e742066756e647320666f72206275726e696e67181c436f6e74656e74011c436f6e74656e747c2c4368616e6e656c4279496401010230543a3a4368616e6e656c4964284368616e6e656c3c543e009400000000000000000000000000000000000000000000000000000000000000000000000000004c4368616e6e656c43617465676f72794279496401010250543a3a4368616e6e656c43617465676f727949643c4368616e6e656c43617465676f727900000024566964656f4279496401010228543a3a566964656f496420566964656f3c543e00300000000000000000000000000044566964656f43617465676f72794279496401010248543a3a566964656f43617465676f7279496434566964656f43617465676f7279000000544e6578744368616e6e656c43617465676f72794964010050543a3a4368616e6e656c43617465676f7279496420000000000000000000344e6578744368616e6e656c4964010030543a3a4368616e6e656c4964200000000000000000004c4e657874566964656f43617465676f72794964010048543a3a566964656f43617465676f72794964200000000000000000002c4e657874566964656f4964010028543a3a566964656f496420000000000000000000484e65787443757261746f7247726f75704964010044543a3a43757261746f7247726f75704964200000000000000000004043757261746f7247726f75704279496401010244543a3a43757261746f7247726f757049643c43757261746f7247726f75703c543e000800000034566964656f506f73744279496401020228543a3a566964656f496438543a3a566964656f506f7374496430566964656f506f73743c543e028802000000000000000000000000000000000000000000000000000000000000000000003c4e657874566964656f506f73744964010038543a3a566964656f506f737449642000000000000000000028436f6d6d69746d656e740100803c54206173206672616d655f73797374656d3a3a54726169743e3a3a4861736880000000000000000000000000000000000000000000000000000000000000000000404d6178526577617264416c6c6f77656401003042616c616e63654f663c543e400000000000000000000000000000000000444d696e436173686f7574416c6c6f77656401003042616c616e63654f663c543e400000000000000000000000000000000000484d696e41756374696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657210000000000454204d696e2061756374696f6e206475726174696f6e484d617841756374696f6e4475726174696f6e010038543a3a426c6f636b4e756d62657210000000000454204d61782061756374696f6e206475726174696f6e644d696e41756374696f6e457874656e73696f6e506572696f64010038543a3a426c6f636b4e756d62657210000000000474204d696e2061756374696f6e20657874656e73696f6e20706572696f64644d617841756374696f6e457874656e73696f6e506572696f64010038543a3a426c6f636b4e756d62657210000000000474204d61782061756374696f6e20657874656e73696f6e20706572696f64484d696e4269644c6f636b4475726174696f6e010038543a3a426c6f636b4e756d62657210000000000458204d696e20626964206c6f636b206475726174696f6e484d61784269644c6f636b4475726174696f6e010038543a3a426c6f636b4e756d62657210000000000458204d617820626964206c6f636b206475726174696f6e404d696e5374617274696e67507269636501003042616c616e63654f663c543e40000000000000000000000000000000000468204d696e2061756374696f6e2073746172696e67207072696365404d61785374617274696e67507269636501003042616c616e63654f663c543e40000000000000000000000000000000000468204d61782061756374696f6e2073746172696e67207072696365444d696e43726561746f72526f79616c747901001c50657262696c6c1000000000047c204d696e2063726561746f7220726f79616c74792070657263656e74616765444d617843726561746f72526f79616c747901001c50657262696c6c1000000000047c204d61782063726561746f7220726f79616c74792070657263656e74616765284d696e4269645374657001003042616c616e63654f663c543e40000000000000000000000000000000000454204d696e2061756374696f6e206269642073746570284d61784269645374657001003042616c616e63654f663c543e40000000000000000000000000000000000454204d61782061756374696f6e20626964207374657054506c617466726f6d46656550657263656e7461676501001c50657262696c6c1000000000046020506c6174666f726d206665652070657263656e746167655c41756374696f6e53746172747341744d617844656c7461010038543a3a426c6f636b4e756d626572100000000004b8204d61782064656c7461206265747765656e2063757272656e7420626c6f636b20616e6420737461727473206174644d617841756374696f6e57686974654c6973744c656e6774680100244d61784e756d62657210000000000484204d6178206e66742061756374696f6e2077686974656c697374206c656e677468784f70656e41756374696f6e4269644279566964656f416e644d656d62657201020228543a3a566964656f49642c543a3a4d656d6265724964444f70656e41756374696f6e4269643c543e027000000000000000000000000000000000000000000000000000000000045c204269647320666f72206f70656e2061756374696f6e7301cc506372656174655f63757261746f725f67726f75700004a420416464206e65772063757261746f722067726f757020746f2072756e74696d652073746f72616765607365745f63757261746f725f67726f75705f737461747573084063757261746f725f67726f75705f696444543a3a43757261746f7247726f757049642469735f61637469766510626f6f6c04210120536574206069735f616374697665602073746174757320666f722063757261746f722067726f757020756e64657220676976656e206063757261746f725f67726f75705f696460506164645f63757261746f725f746f5f67726f7570084063757261746f725f67726f75705f696444543a3a43757261746f7247726f757049642863757261746f725f696430543a3a43757261746f72496404f0204164642063757261746f7220746f2063757261746f722067726f757020756e64657220676976656e206063757261746f725f67726f75705f6964606472656d6f76655f63757261746f725f66726f6d5f67726f7570084063757261746f725f67726f75705f696444543a3a43757261746f7247726f757049642863757261746f725f696430543a3a43757261746f72496404a82052656d6f76652063757261746f722066726f6d206120676976656e2063757261746f722067726f7570386372656174655f6368616e6e656c08146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e18706172616d73704368616e6e656c4372656174696f6e506172616d65746572733c543e00387570646174655f6368616e6e656c0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c496418706172616d73684368616e6e656c557064617465506172616d65746572733c543e003864656c6574655f6368616e6e656c0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c4964546e756d5f6f626a656374735f746f5f64656c6574650c75363400807570646174655f6368616e6e656c5f63656e736f72736869705f73746174757310146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c49642c69735f63656e736f72656410626f6f6c24726174696f6e616c651c5665633c75383e005c6372656174655f6368616e6e656c5f63617465676f727908146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e18706172616d73844368616e6e656c43617465676f72794372656174696f6e506172616d6574657273005c7570646174655f6368616e6e656c5f63617465676f72790c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e2c63617465676f72795f696450543a3a4368616e6e656c43617465676f7279496418706172616d737c4368616e6e656c43617465676f7279557064617465506172616d6574657273005c64656c6574655f6368616e6e656c5f63617465676f727908146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e2c63617465676f72795f696450543a3a4368616e6e656c43617465676f7279496400306372656174655f766964656f0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c496418706172616d7368566964656f4372656174696f6e506172616d65746572733c543e00307570646174655f766964656f0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f496418706172616d7360566964656f557064617465506172616d65746572733c543e003064656c6574655f766964656f0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f4964406173736574735f746f5f72656d6f76656442547265655365743c446174614f626a65637449643c543e3e004c7365745f66656174757265645f766964656f7308146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e106c6973743c5665633c543a3a566964656f49643e00546372656174655f766964656f5f63617465676f727908146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e18706172616d737c566964656f43617465676f72794372656174696f6e506172616d657465727300547570646174655f766964656f5f63617465676f72790c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e2c63617465676f72795f696448543a3a566964656f43617465676f7279496418706172616d7374566964656f43617465676f7279557064617465506172616d6574657273005464656c6574655f766964656f5f63617465676f727908146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e2c63617465676f72795f696448543a3a566964656f43617465676f7279496400787570646174655f766964656f5f63656e736f72736869705f73746174757310146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f49642c69735f63656e736f72656410626f6f6c24726174696f6e616c651c5665633c75383e002c6372656174655f706f737408146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e18706172616d7378566964656f506f73744372656174696f6e506172616d65746572733c543e0038656469745f706f73745f746578741020766964656f5f696428543a3a566964656f49641c706f73745f696438543a3a566964656f506f73744964146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e206e65775f746578741c5665633c75383e002c64656c6574655f706f7374101c706f73745f696438543a3a566964656f506f7374496420766964656f5f696428543a3a566964656f4964146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e18706172616d7378566964656f506f737444656c6574696f6e506172616d65746572733c543e003472656163745f746f5f706f737410246d656d6265725f69642c543a3a4d656d626572496420766964656f5f696428543a3a566964656f49641c706f73745f696438543a3a566964656f506f737449642c7265616374696f6e5f696434543a3a5265616374696f6e4964003872656163745f746f5f766964656f0c246d656d6265725f69642c543a3a4d656d626572496420766964656f5f696428543a3a566964656f49642c7265616374696f6e5f696434543a3a5265616374696f6e496400507570646174655f6d6f64657261746f725f7365740c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e386e65775f6d6f64657261746f72735442547265655365743c543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c496400447570646174655f636f6d6d69746d656e7404386e65775f636f6d6d69746d656e74803c54206173206672616d655f73797374656d3a3a54726169743e3a3a486173680050636c61696d5f6368616e6e656c5f7265776172640c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e1470726f6f66505665633c50726f6f66456c656d656e743c543e3e106974656d3850756c6c5061796d656e743c543e00647570646174655f6d61785f7265776172645f616c6c6f7765640418616d6f756e743042616c616e63654f663c543e00687570646174655f6d696e5f636173686f75745f616c6c6f7765640418616d6f756e743042616c616e63654f663c543e002469737375655f6e66740c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f496418706172616d73604e667449737375616e6365506172616d65746572733c543e0428204973737565204e46544873746172745f6f70656e5f61756374696f6e0c206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f49643861756374696f6e5f706172616d73504f70656e41756374696f6e506172616d733c543e047420537461727420766964656f206e6674206f70656e2061756374696f6e5473746172745f656e676c6973685f61756374696f6e0c206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f49643861756374696f6e5f706172616d735c456e676c69736841756374696f6e506172616d733c543e048020537461727420766964656f206e667420656e676c6973682061756374696f6e5863616e63656c5f656e676c6973685f61756374696f6e08206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f4964004c63616e63656c5f6f70656e5f61756374696f6e08206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f4964003063616e63656c5f6f6666657208206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f496404442043616e63656c204e6674206f666665723863616e63656c5f6275795f6e6f7708206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f496404582043616e63656c204e66742073656c6c206f72646572507570646174655f6275795f6e6f775f70726963650c206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f4964246e65775f70726963653042616c616e63654f663c543e04642055706461746520427579206e6f77206e6674207072696365546d616b655f6f70656e5f61756374696f6e5f6269640c387061727469636970616e745f69642c543a3a4d656d626572496420766964656f5f696428543a3a566964656f4964286269645f616d6f756e743042616c616e63654f663c543e0444204d616b652061756374696f6e20626964606d616b655f656e676c6973685f61756374696f6e5f6269640c387061727469636970616e745f69642c543a3a4d656d626572496420766964656f5f696428543a3a566964656f4964286269645f616d6f756e743042616c616e63654f663c543e0444204d616b652061756374696f6e206269645c63616e63656c5f6f70656e5f61756374696f6e5f62696408387061727469636970616e745f69642c543a3a4d656d626572496420766964656f5f696428543a3a566964656f496404602043616e63656c206f70656e2061756374696f6e2062696458736574746c655f656e676c6973685f61756374696f6e0420766964656f5f696428543a3a566964656f4964086820436c61696d20776f6e20656e676c6973682061756374696f6e602043616e2062652063616c6c656420627920616e796f6e65607069636b5f6f70656e5f61756374696f6e5f77696e6e657210206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f49642477696e6e65725f69642c543a3a4d656d626572496418636f6d6d69743042616c616e63654f663c543e086020416363657074206f70656e2061756374696f6e20626964902053686f756c64206f6e6c792062652063616c6c65642062792061756374696f6e656572246f666665725f6e66741020766964656f5f696428543a3a566964656f4964206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e08746f2c543a3a4d656d6265724964147072696365504f7074696f6e3c42616c616e63654f663c543e3e0428204f66666572204e667438736c696e675f6e66745f6261636b0820766964656f5f696428543a3a566964656f4964206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e04c82052657475726e204e6674206261636b20746f20746865206f726967696e616c20617274697374206174206e6f20636f7374546163636570745f696e636f6d696e675f6f666665720420766964656f5f696428543a3a566964656f496404682041636365707420696e636f6d696e67204e6674206f666665722073656c6c5f6e66740c20766964656f5f696428543a3a566964656f4964206f776e65725f6964e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e1470726963653042616c616e63654f663c543e04242053656c6c204e66741c6275795f6e66740c20766964656f5f696428543a3a566964656f4964387061727469636970616e745f69642c543a3a4d656d62657249643070726963655f636f6d6d69743042616c616e63654f663c543e042020427579204e6674506368616e6e656c5f6f776e65725f72656d61726b0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c49640c6d73671c5665633c75383e0454204368616e6e656c206f776e65722072656d61726b6c6368616e6e656c5f636f6c6c61626f7261746f725f72656d61726b0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c49640c6d73671c5665633c75383e0470204368616e6e656c20636f6c6c61626f7261746f722072656d61726b606368616e6e656c5f6d6f64657261746f725f72656d61726b0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e286368616e6e656c5f696430543a3a4368616e6e656c49640c6d73671c5665633c75383e0464204368616e6e656c206d6f64657261746f722072656d61726b406e66745f6f776e65725f72656d61726b0c146163746f72e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e20766964656f5f696428543a3a566964656f49640c6d73671c5665633c75383e0444204e4654206f776e65722072656d61726b01cc4c43757261746f7247726f757043726561746564043843757261746f7247726f75704964005443757261746f7247726f7570537461747573536574083843757261746f7247726f7570496410626f6f6c003043757261746f724164646564083843757261746f7247726f757049642443757261746f724964003843757261746f7252656d6f766564083843757261746f7247726f757049642443757261746f72496400384368616e6e656c437265617465641030436f6e74656e744163746f72244368616e6e656c49641c4368616e6e656c644368616e6e656c4372656174696f6e506172616d657465727300384368616e6e656c557064617465641030436f6e74656e744163746f72244368616e6e656c49641c4368616e6e656c5c4368616e6e656c557064617465506172616d657465727300504368616e6e656c41737365747352656d6f7665641030436f6e74656e744163746f72244368616e6e656c49645842547265655365743c446174614f626a65637449643e1c4368616e6e656c00384368616e6e656c44656c657465640830436f6e74656e744163746f72244368616e6e656c496400784368616e6e656c43656e736f7273686970537461747573557064617465641030436f6e74656e744163746f72244368616e6e656c496428497343656e736f7265641c5665633c75383e00584368616e6e656c43617465676f7279437265617465640c444368616e6e656c43617465676f727949643c4368616e6e656c43617465676f7279844368616e6e656c43617465676f72794372656174696f6e506172616d657465727300584368616e6e656c43617465676f7279557064617465640c30436f6e74656e744163746f72444368616e6e656c43617465676f727949647c4368616e6e656c43617465676f7279557064617465506172616d657465727300584368616e6e656c43617465676f727944656c657465640830436f6e74656e744163746f72444368616e6e656c43617465676f727949640050566964656f43617465676f7279437265617465640c30436f6e74656e744163746f723c566964656f43617465676f727949647c566964656f43617465676f72794372656174696f6e506172616d65746572730050566964656f43617465676f7279557064617465640c30436f6e74656e744163746f723c566964656f43617465676f7279496474566964656f43617465676f7279557064617465506172616d65746572730050566964656f43617465676f727944656c657465640830436f6e74656e744163746f723c566964656f43617465676f727949640030566964656f437265617465641030436f6e74656e744163746f72244368616e6e656c49641c566964656f49645c566964656f4372656174696f6e506172616d65746572730030566964656f557064617465640c30436f6e74656e744163746f721c566964656f496454566964656f557064617465506172616d65746572730030566964656f44656c657465640830436f6e74656e744163746f721c566964656f49640070566964656f43656e736f7273686970537461747573557064617465641030436f6e74656e744163746f721c566964656f496428497343656e736f7265641c5665633c75383e00444665617475726564566964656f735365740830436f6e74656e744163746f72305665633c566964656f49643e0040566964656f506f7374437265617465640824566964656f506f73742c566964656f506f737449640050566964656f506f737454657874557064617465641030436f6e74656e744163746f721c5665633c75383e2c566964656f506f737449641c566964656f49640040566964656f506f737444656c657465640c24566964656f506f73742c566964656f506f7374496430436f6e74656e744163746f72004c5265616374696f6e546f566964656f506f737410204d656d62657249641c566964656f49642c566964656f506f73744964285265616374696f6e4964003c5265616374696f6e546f566964656f0c204d656d62657249641c566964656f4964285265616374696f6e4964004c4d6f64657261746f725365745570646174656408244368616e6e656c4964304d6f64657261746f725365740044436f6d6d69746d656e745570646174656404104861736800504368616e6e656c52657761726455706461746564081c42616c616e6365244368616e6e656c496400404d617852657761726455706461746564041c42616c616e636500444d696e436173686f757455706461746564041c42616c616e63650054456e676c69736841756374696f6e537461727465640c30436f6e74656e744163746f721c566964656f496450456e676c69736841756374696f6e506172616d7300484f70656e41756374696f6e537461727465641030436f6e74656e744163746f721c566964656f4964444f70656e41756374696f6e506172616d73344f70656e41756374696f6e496400244e66744973737565640c30436f6e74656e744163746f721c566964656f4964544e667449737375616e6365506172616d6574657273003841756374696f6e4269644d61646510204d656d62657249641c566964656f49643843757272656e6379416d6f756e74404f7074696f6e3c4d656d62657249643e004841756374696f6e42696443616e63656c656408204d656d62657249641c566964656f4964003c41756374696f6e43616e63656c65640830436f6e74656e744163746f721c566964656f49640054456e676c69736841756374696f6e536574746c65640c204d656d6265724964244163636f756e7449641c566964656f496400604269644d616465436f6d706c6574696e6741756374696f6e0c204d656d62657249641c566964656f4964404f7074696f6e3c4d656d62657249643e00584f70656e41756374696f6e42696441636365707465641030436f6e74656e744163746f721c566964656f4964204d656d62657249643843757272656e6379416d6f756e7400304f6666657253746172746564101c566964656f496430436f6e74656e744163746f72204d656d6265724964584f7074696f6e3c43757272656e6379416d6f756e743e00344f666665724163636570746564041c566964656f496400344f6666657243616e63656c6564081c566964656f496430436f6e74656e744163746f7200404e667453656c6c4f726465724d6164650c1c566964656f496430436f6e74656e744163746f723843757272656e6379416d6f756e7400244e6674426f75676874081c566964656f4964204d656d626572496400384275794e6f7743616e63656c6564081c566964656f496430436f6e74656e744163746f7200484275794e6f775072696365557064617465640c1c566964656f496430436f6e74656e744163746f723843757272656e6379416d6f756e7400844e6674536c696e6765644261636b546f5468654f726967696e616c417274697374081c566964656f496430436f6e74656e744163746f7200504368616e6e656c4f776e657252656d61726b65640c30436f6e74656e744163746f72244368616e6e656c49641c5665633c75383e0470204d65746170726f746f636f6c732072656c61746564206576656e746c4368616e6e656c436f6c6c61626f7261746f7252656d61726b65640c30436f6e74656e744163746f72244368616e6e656c49641c5665633c75383e00604368616e6e656c4d6f64657261746f7252656d61726b65640c30436f6e74656e744163746f72244368616e6e656c49641c5665633c75383e00404e66744f776e657252656d61726b65640c30436f6e74656e744163746f721c566964656f49641c5665633c75383e00046c4d61784e756d6265724f6643757261746f727350657247726f7570244d61784e756d626572103200000004c8204578706f72747320636f6e7374202d20206d6178206e756d626572206f662063757261746f7273207065722067726f75705d0154466561747572654e6f74496d706c656d656e74656404602046656174757265204e6f7420496d706c656d656e7465649843757261746f7249734e6f74414d656d6265724f66476976656e43757261746f7247726f75700449012043757261746f7220756e6465722070726f76696465642063757261746f72206964206973206e6f742061206d656d626572206f662063757261726f722067726f757020756e64657220676976656e206964a843757261746f724973416c7265616479414d656d6265724f66476976656e43757261746f7247726f75700459012043757261746f7220756e6465722070726f76696465642063757261746f7220696420697320616c72656164792061206d656d626572206f662063757261726f722067726f757020756e64657220676976656e2069646043757261746f7247726f7570446f65734e6f744578697374048c20476976656e2063757261746f722067726f757020646f6573206e6f742065786973747043757261746f727350657247726f75704c696d69745265616368656404bc204d6178206e756d626572206f662063757261746f7273207065722067726f7570206c696d697420726561636865645c43757261746f7247726f757049734e6f7441637469766504702043757261746f722067726f7570206973206e6f74206163746976654043757261746f724964496e76616c696404dc2043757261746f72206964206973206e6f74206120776f726b657220696420696e20636f6e74656e7420776f726b696e672067726f7570384c656164417574684661696c6564046c204c6561642061757468656e7469636174696f6e206661696c6564404d656d626572417574684661696c65640474204d656d6265722061757468656e7469636174696f6e206661696c65644443757261746f72417574684661696c656404782043757261746f722061757468656e7469636174696f6e206661696c6564244261644f726967696e047c20457870656374656420726f6f74206f72207369676e6564206f726967696e484163746f724e6f74417574686f72697a656404b4204f7065726174696f6e2063616e6e6f7420626520706572666f6d656420776974682074686973204163746f725043617465676f7279446f65734e6f74457869737404b02041204368616e6e656c206f7220566964656f2043617465676f727920646f6573206e6f742065786973742e4c4368616e6e656c446f65734e6f744578697374045c204368616e6e656c20646f6573206e6f7420657869737444566964656f446f65734e6f744578697374045420566964656f20646f6573206e6f7420657869737434566964656f496e536561736f6e04f820566664656f20696e20736561736f6e2063616e60742062652072656d6f766564202862656361757365206f7264657220697320696d706f7274616e74299843616e6e6f7443656e736f726543757261746f7247726f75704f776e65644368616e6e656c7304e82043757261746f72732063616e206f6e6c792063656e736f72206e6f6e2d63757261746f722067726f7570206f776e6564206368616e6e656c73444163746f7243616e6e6f7442654c65616404cc204163746f722063616e6e6f7420617574686f72697a65206173206c65616420666f7220676976656e2065787472696e7369638c4368616e6e656c43656e736f72736869705374617475734469644e6f744368616e676504a4204368616e6e656c2063656e736f72736869702073746174757320646964206e6f74206368616e676584566964656f43656e736f72736869705374617475734469644e6f744368616e6765049c20566964656f2063656e736f72736869702073746174757320646964206e6f74206368616e6765544163746f7243616e6e6f744f776e4368616e6e656c0464204163746f722063616e6e6f74204f776e206368616e6e656c404e6674416c72656164794578697374730498204e667420666f7220676976656e20766964656f20696420616c7265616479206578697374733c4e6674446f65734e6f7445786973740498204e667420666f7220676976656e20766964656f20696420646f6573206e6f742065786973746c4f766572666c6f774f72556e646572666c6f7748617070656e65640494204f766572666c6f77206f7220756e646572666c6f77206572726f722068617070656e656434446f65734e6f744f776e4e6674047820476976656e206f726967696e20646f6573206e6f74206f776e206e667464526f79616c74795570706572426f756e644578636565646564047420526f79616c747920557070657220426f756e6420457863656564656464526f79616c74794c6f776572426f756e644578636565646564047420526f79616c7479204c6f77657220426f756e642045786365656465648441756374696f6e4475726174696f6e5570706572426f756e64457863656564656404982041756374696f6e206475726174696f6e20757070657220626f756e642065786365656465648441756374696f6e4475726174696f6e4c6f776572426f756e64457863656564656404982041756374696f6e206475726174696f6e206c6f77657220626f756e6420657863656564656484457874656e73696f6e506572696f645570706572426f756e64457863656564656404b82041756374696f6e20657874656e73696f6e20706572696f6420757070657220626f756e6420657863656564656484457874656e73696f6e506572696f644c6f776572426f756e64457863656564656404b82041756374696f6e20657874656e73696f6e20706572696f64206c6f77657220626f756e64206578636565646564844269644c6f636b4475726174696f6e5570706572426f756e644578636565646564049c20426964206c6f636b206475726174696f6e20757070657220626f756e64206578636565646564844269644c6f636b4475726174696f6e4c6f776572426f756e644578636565646564049c20426964206c6f636b206475726174696f6e206c6f77657220626f756e642065786365656465647c5374617274696e6750726963655570706572426f756e6445786365656465640490205374617274696e6720707269636520757070657220626f756e642065786365656465647c5374617274696e6750726963654c6f776572426f756e6445786365656465640490205374617274696e67207072696365206c6f77657220626f756e642065786365656465648041756374696f6e426964537465705570706572426f756e64457863656564656404982041756374696f6e20626964207374657020757070657220626f756e642065786365656465648041756374696f6e426964537465704c6f776572426f756e64457863656564656404982041756374696f6e206269642073746570206c6f77657220626f756e642065786365656465644c496e73756666696369656e7442616c616e6365045420496e73756666696369656e742062616c616e63656442696453746570436f6e73747261696e7456696f6c6174656404b8204d696e696d616c2061756374696f6e20626964207374657020636f6e73747261696e742076696f6c617465642e64496e76616c6964426964416d6f756e74537065636966696564048c20436f6d6d697420766572696669636174696f6e20666f722062696420616d6f756e747c5374617274696e675072696365436f6e73747261696e7456696f6c6174656404b02041756374696f6e207374617274696e6720707269636520636f6e73747261696e742076696f6c617465642e50416374696f6e48617342696473416c726561647904ac20416c7265616479206163746976652061756374696f6e2063616e6e6f742062652063616e63656c6c6564304e667449734e6f7449646c65049d012043616e206e6f74206372656174652061756374696f6e20666f72204e66742c2069662061756374696f6e2068617665206265656e20616c72656164792073746172746564206f72206e6674206973206c6f636b656420666f7220746865207472616e736665726050656e64696e674f66666572446f65734e6f7445786973740480204e6f2070656e64696e67206f666665727320666f7220676976656e204e6674545265776172644163636f756e7449734e6f7453657404cc2043726561746f7220726f79616c747920726571756972657320726577617264206163636f756e7420746f206265207365742e404163746f7249734e6f74426964646572046c204163746f72206973206e6f742061206c617374206269646465726041756374696f6e43616e6e6f744265436f6d706c6574656404702041756374696f6e2063616e6e6f7420626520636f6d706c657465643c426964446f65734e6f744578697374046c2041756374696f6e20646f6573206e6f74206861766520626964734c4269644973466f725061737441756374696f6e04982053656c65637465642042696420697320666f722070617374206f70656e2061756374696f6e6853746172747341744c6f776572426f756e644578636565646564049c2041756374696f6e20737461727473206174206c6f77657220626f756e642065786365656465646853746172747341745570706572426f756e644578636565646564049c2041756374696f6e2073746172747320617420757070657220626f756e642065786365656465644841756374696f6e4469644e6f74537461727404602041756374696f6e20646964206e6f742073746172746564444e6f74496e41756374696f6e53746174650470204e6674206973206e6f7420696e2061756374696f6e2073746174657c4d656d62657249734e6f74416c6c6f776564546f506172746963697061746504c0204d656d626572206973206e6f7420616c6c6f77656420746f20706172746963697061746520696e2061756374696f6e544d656d62657250726f66696c654e6f74466f756e640464204d656d6265722070726f66696c65206e6f7420666f756e644c4e66744e6f74496e4275794e6f77537461746504a020476976656e20766964656f206e6674206973206e6f7420696e20627579206e6f7720737461746568496e76616c69644275794e6f77507269636550726f7669646564049820496e76616c696420427579204e6f7720707269636520636f6d6d69742070726f76696465645049734e6f744f70656e41756374696f6e54797065046c2041756374696f6e2074797065206973206e6f7420604f70656e605c49734e6f74456e676c69736841756374696f6e5479706504782041756374696f6e2074797065206973206e6f742060456e676c697368606c4269644c6f636b4475726174696f6e49734e6f7445787069726564048420426964206c6f636b206475726174696f6e206973206e6f742065787069726564684e667441756374696f6e4973416c726561647945787069726564047c204e66742061756374696f6e20697320616c72656164792065787069726564744275794e6f7749734c6573735468656e5374617274696e67507269636504b02041756374696f6e20627579206e6f77206973206c657373207468656e207374617274696e67207072696365ac4d617841756374696f6e57686974654c6973744c656e6774685570706572426f756e64457863656564656404c8204d61782061756374696f6e2077686974656c697374206c656e67746820757070657220626f756e642065786365656465646457686974656c6973744861734f6e6c794f6e654d656d62657204982041756374696f6e2077686974656c69737420686173206f6e6c79206f6e65206d656d626572ac457874656e73696f6e506572696f644973477265617465725468656e41756374696f6e4475726174696f6e04c820457874656e73696f6e20706572696f642069732067726561746572207468656e2061756374696f6e206475726174696f6e444e6f41737365747353706563696669656404b0204e6f2061737365747320746f2062652072656d6f7665642068617665206265656e2073706563696669656454496e76616c696441737365747350726f7669646564046c204368616e6e656c2061737365747320666561736962696c697479544368616e6e656c436f6e7461696e73566964656f73045c204368616e6e656c20436f6e7461696e7320566964656f544368616e6e656c436f6e7461696e734173736574730460204368616e6e656c20436f6e7461696e73204173736574735c496e76616c696442616753697a655370656369666965640480204261672053697a6520737065636966696564206973206e6f742076616c696454566964656f506f7374446f65734e6f744578697374046820566964656f506f737420646f6573206e6f7420657869737473504d6967726174696f6e4e6f7446696e6973686564045c204d6967726174696f6e206e6f7420646f6e6520796574445265706c79446f65734e6f7445786973740470205061727465636970616e74206973206e6f742061206d656d62657240436f6d6d656e747344697361626c6564044820636f6d6d656e74732064697361626c6564584d6f64657261746f72734c696d6974526561636865640464206d6f64657261746f7273206c696d697420726561636865645443616e6e6f74456469744465736372697074696f6e045c2063616e6e6f74206564697420766964656f20706f7374645769746e657373566572696669636174696f6e4661696c65640470206661696c6564207769746e65737320766572696669636174696f6e485769746e6573734e6f7450726f76696465640454207769746e657373206e6f742070726f76696465647c526174696f6e616c654e6f7450726f766964656442794d6f64657261746f72045c20726174696f6e616c65206e6f742070726f76696465644c556e73756666696369656e7442616c616e6365045420496e73756666696369656e742062616c616e63656c496e73756666696369656e74547265617375727942616c616e6365047820496e73756666696369656e742074726561737572792062616c616e636554496e76616c69644d656d62657250726f7669646564047420496e76616c6964206d656d62657220696420207370656369666965643c4163746f724e6f74414d656d6265720458204163746f72206973206e6f742041204d656d626572785061796d656e7450726f6f66566572696669636174696f6e4661696c65640488205061796d656e742050726f6f6620766572696669636174696f6e206661696c656460546f74616c5265776172644c696d69744578636565646564045820546f74616c2072657761726420746f6f206869676864556e73756666696369656e74436173686f7574416d6f756e74046420436173686f757420616d6f756e7420746f6f20736d616c6c785265776172644163636f756e744e6f74466f756e64496e4368616e6e656c045c20526577617264206163636f756e74206973206e6f6e65191c53746f72616765011c53746f72616765484055706c6f6164696e67426c6f636b6564010010626f6f6c040004a020446566696e6573207768657468657220616c6c206e65772075706c6f61647320626c6f636b656410426167730101022042616749643c543e184261673c543e004c00000000000000000000000000000000000000044820426167732073746f72616765206d61702e4c4e65787453746f726167654275636b65744964010048543a3a53746f726167654275636b6574496420000000000000000004ac2053746f72616765206275636b657420696420636f756e7465722e20537461727473206174207a65726f2e404e657874446174614f626a656374496401003c543a3a446174614f626a656374496420000000000000000004a02044617461206f626a65637420696420636f756e7465722e20537461727473206174207a65726f2e4453746f726167654275636b65744279496401010248543a3a53746f726167654275636b657449644053746f726167654275636b65743c543e00a800000000000000000000000000000000000000000000000000000000000000000000000000000000000004442053746f72616765206275636b6574732e24426c61636b6c6973740101020c4369640828290000048020426c61636b6c69737465642064617461206f626a656374206861736865732e5043757272656e74426c61636b6c69737453697a6501000c753634200000000000000000047820426c61636b6c69737420636f6c6c656374696f6e20636f756e7465722e60446174614f626a6563745065724d6567616279746546656501003042616c616e63654f663c543e400000000000000000000000000000000004b02053697a652062617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e6453746f726167654275636b6574735065724261674c696d697401000c75363420000000000000000004a0202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742e68566f75636865724d61784f626a6563747353697a654c696d697401000c75363420000000000000000004f820224d6178206f626a656374732073697a6520666f7220612073746f72616765206275636b657420766f756368657222206e756d626572206c696d69742e70566f75636865724d61784f626a656374734e756d6265724c696d697401000c75363420000000000000000004050120224d6178206f626a65637473206e756d62657220666f7220612073746f7261676520206275636b657420766f756368657222206e756d626572206c696d69742e6844796e616d69634261674372656174696f6e506f6c69636965730101023844796e616d696342616754797065dc44796e616d69634261674372656174696f6e506f6c6963793c543a3a446973747269627574696f6e4275636b657446616d696c7949643e002400000000000000000004c82044796e616d69634261674372656174696f6e506f6c6963792062792062616720747970652073746f72616765206d61702e3c446174614f626a65637473427949640102022042616749643c543e3c543a3a446174614f626a656374496460446174614f626a6563743c42616c616e63654f663c543e3e0268000000000000000000000000000000000000000000000000000004b0202744617461206f626a6563747320666f722062616773272073746f7261676520646f75626c65206d61702e784e657874446973747269627574696f6e4275636b657446616d696c794964010074543a3a446973747269627574696f6e4275636b657446616d696c79496420000000000000000004dc20446973747269627574696f6e206275636b65742066616d696c7920696420636f756e7465722e20537461727473206174207a65726f2e70446973747269627574696f6e4275636b657446616d696c794279496401010274543a3a446973747269627574696f6e4275636b657446616d696c7949646c446973747269627574696f6e4275636b657446616d696c793c543e00200000000000000000047820446973747269627574696f6e206275636b65742066616d696c6965732e80446973747269627574696f6e4275636b6574427946616d696c7949644279496401020274543a3a446973747269627574696f6e4275636b657446616d696c79496468543a3a446973747269627574696f6e4275636b6574496e64657854446973747269627574696f6e4275636b65743c543e023000000000000000000000000004a82027446973747269627574696f6e206275636b6574272073746f7261676520646f75626c65206d61702e78446973747269627574696f6e4275636b657446616d696c794e756d62657201000c75363420000000000000000004f020546f74616c206e756d626572206f6620646973747269627574696f6e206275636b65742066616d696c69657320696e207468652073797374656d2e78446973747269627574696f6e4275636b6574735065724261674c696d697401000c75363420000000000000000004b42022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e01905464656c6574655f73746f726167655f6275636b6574044473746f726167655f6275636b65745f696448543a3a53746f726167654275636b657449640421012044656c6574652073746f72616765206275636b65742e204d75737420626520656d7074792e2053746f72616765206f70657261746f72206d757374206265206d697373696e672e7c7570646174655f75706c6f6164696e675f626c6f636b65645f73746174757304286e65775f73746174757310626f6f6c047c205570646174657320676c6f62616c2075706c6f6164696e6720666c61672e507570646174655f646174615f73697a655f66656504446e65775f646174615f73697a655f6665653042616c616e63654f663c543e04d020557064617465732073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e907570646174655f73746f726167655f6275636b6574735f7065725f6261675f6c696d697404246e65775f6c696d69740c75363404c02055706461746573202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742ea47570646174655f73746f726167655f6275636b6574735f766f75636865725f6d61785f6c696d69747308406e65775f6f626a656374735f73697a650c753634486e65775f6f626a656374735f6e756d6265720c75363404b82055706461746573202253746f72616765206275636b65747320766f7563686572206d6178206c696d697473222efc7570646174655f6e756d6265725f6f665f73746f726167655f6275636b6574735f696e5f64796e616d69635f6261675f6372656174696f6e5f706f6c696379084064796e616d69635f6261675f747970653844796e616d696342616754797065646e756d6265725f6f665f73746f726167655f6275636b6574730c75363404310120557064617465206e756d626572206f662073746f72616765206275636b657473207573656420696e20676976656e2064796e616d696320626167206372656174696f6e20706f6c6963792e407570646174655f626c61636b6c697374083472656d6f76655f6861736865733442547265655365743c4369643e286164645f6861736865733442547265655365743c4369643e04c02041646420616e642072656d6f76652068617368657320746f207468652063757272656e7420626c61636b6c6973742e546372656174655f73746f726167655f6275636b65741034696e766974655f776f726b65724c4f7074696f6e3c576f726b657249643c543e3e48616363657074696e675f6e65775f6261677310626f6f6c2873697a655f6c696d69740c753634346f626a656374735f6c696d69740c753634045c204372656174652073746f72616765206275636b65742e787570646174655f73746f726167655f6275636b6574735f666f725f6261670c186261675f69642042616749643c543e2c6164645f6275636b6574737042547265655365743c543a3a53746f726167654275636b657449643e3872656d6f76655f6275636b6574737042547265655365743c543a3a53746f726167654275636b657449643e049020557064617465732073746f72616765206275636b65747320666f722061206261672e2e9463616e63656c5f73746f726167655f6275636b65745f6f70657261746f725f696e76697465044473746f726167655f6275636b65745f696448543a3a53746f726167654275636b657449640415012043616e63656c2070656e64696e672073746f72616765206275636b657420696e766974652e20416e20696e7669746174696f6e206d7573742062652070656e64696e672e78696e766974655f73746f726167655f6275636b65745f6f70657261746f72084473746f726167655f6275636b65745f696448543a3a53746f726167654275636b657449642c6f70657261746f725f69642c576f726b657249643c543e04c420496e766974652073746f72616765206275636b6574206f70657261746f722e204d757374206265206d697373696e672e7872656d6f76655f73746f726167655f6275636b65745f6f70657261746f72044473746f726167655f6275636b65745f696448543a3a53746f726167654275636b6574496404842052656d6f7665732073746f72616765206275636b6574206f70657261746f722e707570646174655f73746f726167655f6275636b65745f737461747573084473746f726167655f6275636b65745f696448543a3a53746f726167654275636b6574496448616363657074696e675f6e65775f6261677310626f6f6c04e0205570646174652077686574686572206e6577206261677320617265206265696e6720616363657074656420666f722073746f726167652e847365745f73746f726167655f6275636b65745f766f75636865725f6c696d6974730c4473746f726167655f6275636b65745f696448543a3a53746f726167654275636b65744964586e65775f6f626a656374735f73697a655f6c696d69740c753634606e65775f6f626a656374735f6e756d6265725f6c696d69740c753634049020536574732073746f72616765206275636b657420766f7563686572206c696d6974732e806163636570745f73746f726167655f6275636b65745f696e7669746174696f6e0c24776f726b65725f69642c576f726b657249643c543e4473746f726167655f6275636b65745f696448543a3a53746f726167654275636b65744964547472616e736163746f725f6163636f756e745f696430543a3a4163636f756e7449640c610120416363657074207468652073746f72616765206275636b657420696e7669746174696f6e2e20416e20696e7669746174696f6e206d757374206d617463682074686520776f726b65725f696420706172616d657465722e5d01204974206163636570747320616e206164646974696f6e616c206163636f756e7420494420287472616e736163746f722920666f7220616363657074696e672064617461206f626a6563747320746f2070726576656e7478207472616e73616374696f6e206e6f6e636520636f6c6c6973696f6e732e747365745f73746f726167655f6f70657261746f725f6d657461646174610c24776f726b65725f69642c576f726b657249643c543e4473746f726167655f6275636b65745f696448543a3a53746f726167654275636b65744964206d657461646174611c5665633c75383e04e020536574732073746f72616765206f70657261746f72206d65746164617461202865672e3a2073746f72616765206e6f64652055524c292e6c6163636570745f70656e64696e675f646174615f6f626a656374731024776f726b65725f69642c576f726b657249643c543e4473746f726167655f6275636b65745f696448543a3a53746f726167654275636b65744964186261675f69642042616749643c543e30646174615f6f626a656374736442547265655365743c543a3a446174614f626a65637449643e04690120412073746f726167652070726f7669646572207369676e616c732074686174207468652064617461206f626a65637420776173207375636365737366756c6c792075706c6f6164656420746f206974732073746f726167652e846372656174655f646973747269627574696f6e5f6275636b65745f66616d696c7900049420437265617465206120646973747269627574696f6e206275636b65742066616d696c792e8464656c6574655f646973747269627574696f6e5f6275636b65745f66616d696c79042466616d696c795f696474543a3a446973747269627574696f6e4275636b657446616d696c79496404982044656c65746573206120646973747269627574696f6e206275636b65742066616d696c792e686372656174655f646973747269627574696f6e5f6275636b6574082466616d696c795f696474543a3a446973747269627574696f6e4275636b657446616d696c79496448616363657074696e675f6e65775f6261677310626f6f6c047820437265617465206120646973747269627574696f6e206275636b65742e847570646174655f646973747269627574696f6e5f6275636b65745f73746174757308246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e48616363657074696e675f6e65775f6261677310626f6f6c04dc2055706461746573206120646973747269627574696f6e206275636b6574202761636365707473206e657720626167732720666c61672e6864656c6574655f646973747269627574696f6e5f6275636b657404246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e04ac2044656c65746520646973747269627574696f6e206275636b65742e204d75737420626520656d7074792e8c7570646174655f646973747269627574696f6e5f6275636b6574735f666f725f62616710186261675f69642042616749643c543e2466616d696c795f696474543a3a446973747269627574696f6e4275636b657446616d696c7949644c6164645f6275636b6574735f696e64696365739042547265655365743c543a3a446973747269627574696f6e4275636b6574496e6465783e5872656d6f76655f6275636b6574735f696e64696365739042547265655365743c543a3a446973747269627574696f6e4275636b6574496e6465783e04a0205570646174657320646973747269627574696f6e206275636b65747320666f722061206261672ea47570646174655f646973747269627574696f6e5f6275636b6574735f7065725f6261675f6c696d697404246e65775f6c696d69740c75363404d420557064617465732022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e7c7570646174655f646973747269627574696f6e5f6275636b65745f6d6f646508246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e30646973747269627574696e6710626f6f6c04dc20557064617465732027646973747269627574696e672720666c616720666f722074686520646973747269627574696e6720666c61672eb87570646174655f66616d696c6965735f696e5f64796e616d69635f6261675f6372656174696f6e5f706f6c696379084064796e616d69635f6261675f747970653844796e616d6963426167547970652066616d696c696573b042547265654d61703c543a3a446973747269627574696f6e4275636b657446616d696c7949642c207533323e04410120557064617465206e756d626572206f66206469737472696275746564206275636b657473207573656420696e20676976656e2064796e616d696320626167206372656174696f6e20706f6c6963792e8c696e766974655f646973747269627574696f6e5f6275636b65745f6f70657261746f7208246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e486f70657261746f725f776f726b65725f69642c576f726b657249643c543e049420496e7669746520616e206f70657261746f722e204d757374206265206d697373696e672ea863616e63656c5f646973747269627574696f6e5f6275636b65745f6f70657261746f725f696e7669746508246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e486f70657261746f725f776f726b65725f69642c576f726b657249643c543e04a02043616e63656c2070656e64696e6720696e766974652e204d7573742062652070656e64696e672e8c72656d6f76655f646973747269627574696f6e5f6275636b65745f6f70657261746f7208246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e486f70657261746f725f776f726b65725f69642c576f726b657249643c543e04982052656d6f76657320646973747269627574696f6e206275636b6574206f70657261746f722e9c7365745f646973747269627574696f6e5f6275636b65745f66616d696c795f6d65746164617461082466616d696c795f696474543a3a446973747269627574696f6e4275636b657446616d696c794964206d657461646174611c5665633c75383e04a42053657420646973747269627574696f6e206275636b65742066616d696c79206d657461646174612e946163636570745f646973747269627574696f6e5f6275636b65745f696e7669746174696f6e0824776f726b65725f69642c576f726b657249643c543e246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e045c204163636570742070656e64696e6720696e766974652e887365745f646973747269627574696f6e5f6f70657261746f725f6d657461646174610c24776f726b65725f69642c576f726b657249643c543e246275636b65745f69645c446973747269627574696f6e4275636b657449643c543e206d657461646174611c5665633c75383e0401012053657420646973747269627574696f6e206f70657261746f72206d6574616461746120666f722074686520646973747269627574696f6e206275636b65742e607375646f5f75706c6f61645f646174615f6f626a656374730418706172616d734c55706c6f6164506172616d65746572733c543e04ac2055706c6f6164206e65772064617461206f626a656374732e20446576656c6f706d656e74206d6f64652e5c7375646f5f6372656174655f64796e616d69635f62616708186261675f69643c44796e616d696342616749643c543e3864656c6574696f6e5f7072697a65884f7074696f6e3c44796e616d696342616744656c6574696f6e5072697a653c543e3e04a02043726561746520612064796e616d6963206261672e20446576656c6f706d656e74206d6f64652e5c73746f726167655f6f70657261746f725f72656d61726b0c24776f726b65725f69642c576f726b657249643c543e4473746f726167655f6275636b65745f696448543a3a53746f726167654275636b657449640c6d73671c5665633c75383e04a02043726561746520612064796e616d6963206261672e20446576656c6f706d656e74206d6f64652e70646973747269627574696f6e5f6f70657261746f725f72656d61726b0c24776f726b65725f69642c576f726b657249643c543e58646973747269627574696f6e5f6275636b65745f69645c446973747269627574696f6e4275636b657449643c543e0c6d73671c5665633c75383e04a02043726561746520612064796e616d6963206261672e20446576656c6f706d656e74206d6f64652e01a45053746f726167654275636b657443726561746564143c53746f726167654275636b65744964404f7074696f6e3c576f726b657249643e10626f6f6c0c7536340c7536341c9820456d697473206f6e206372656174696e67207468652073746f72616765206275636b65742e1c20506172616d7350202d2073746f72616765206275636b657420494444202d20696e766974656420776f726b657270202d20666c61672022616363657074696e675f6e65775f626167732268202d2073697a65206c696d697420666f7220766f75636865722c74202d206f626a65637473206c696d697420666f7220766f75636865722c7c53746f726167654275636b6574496e7669746174696f6e41636365707465640c3c53746f726167654275636b6574496420576f726b65724964244163636f756e74496414c820456d697473206f6e20616363657074696e67207468652073746f72616765206275636b657420696e7669746174696f6e2e1c20506172616d7350202d2073746f72616765206275636b657420494450202d20696e766974656420776f726b657220494460202d207472616e736163746f72206163636f756e742049446c53746f726167654275636b65747355706461746564466f724261670c1442616749646442547265655365743c53746f726167654275636b657449643e6442547265655365743c53746f726167654275636b657449643e14ac20456d697473206f6e207570646174696e672073746f72616765206275636b65747320666f72206261672e1c20506172616d7324202d206261672049449c202d2073746f72616765206275636b65747320746f2061646420494420636f6c6c656374696f6ea8202d2073746f72616765206275636b65747320746f2072656d6f766520494420636f6c6c656374696f6e4c446174614f626a6563747355706c6f616465640c445665633c446174614f626a65637449643e4055706c6f6164506172616d65746572731c42616c616e6365148420456d697473206f6e2075706c6f6164696e672064617461206f626a656374732e1c20506172616d734c202d2064617461206f626a65637473204944737c202d20696e697469616c2075706c6f6164696e6720706172616d657465727374202d2064656c6574696f6e207072697a6520666f72206f626a656374736853746f726167654f70657261746f724d657461646174615365740c3c53746f726167654275636b6574496420576f726b657249641c5665633c75383e14c020456d697473206f6e2073657474696e67207468652073746f72616765206f70657261746f72206d657461646174612e1c20506172616d7350202d2073746f72616765206275636b657420494450202d20696e766974656420776f726b65722049442c202d206d657461646174617453746f726167654275636b6574566f75636865724c696d6974735365740c3c53746f726167654275636b657449640c7536340c75363414d020456d697473206f6e2073657474696e67207468652073746f72616765206275636b657420766f7563686572206c696d6974732e1c20506172616d7350202d2073746f72616765206275636b65742049447c202d206e657720746f74616c206f626a656374732073697a65206c696d697484202d206e657720746f74616c206f626a65637473206e756d626572206c696d69746850656e64696e67446174614f626a656374734163636570746564103c53746f726167654275636b6574496420576f726b657249641442616749645842547265655365743c446174614f626a65637449643e18a420456d697473206f6e20616363657074696e672070656e64696e672064617461206f626a656374732e1c20506172616d7350202d2073746f72616765206275636b657420494488202d20776f726b6572204944202873746f726167652070726f76696465722049442924202d206261672049445c202d2070656e64696e672064617461206f626a656374738053746f726167654275636b6574496e7669746174696f6e43616e63656c6c6564043c53746f726167654275636b657449640ccc20456d697473206f6e2063616e63656c6c696e67207468652073746f72616765206275636b657420696e7669746174696f6e2e1c20506172616d7350202d2073746f72616765206275636b65742049447053746f726167654275636b65744f70657261746f72496e7669746564083c53746f726167654275636b6574496420576f726b6572496410c420456d697473206f6e207468652073746f72616765206275636b6574206f70657261746f7220696e7669746174696f6e2e1c20506172616d7350202d2073746f72616765206275636b6574204944ac202d206f70657261746f7220776f726b6572204944202873746f726167652070726f7669646572204944297053746f726167654275636b65744f70657261746f7252656d6f766564043c53746f726167654275636b657449640cb820456d697473206f6e207468652073746f72616765206275636b6574206f70657261746f722072656d6f76616c2e1c20506172616d7350202d2073746f72616765206275636b65742049446c55706c6f6164696e67426c6f636b537461747573557064617465640410626f6f6c0c090120456d697473206f6e206368616e67696e67207468652073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e1c20506172616d7334202d206e6577207374617475737c446174614f626a6563745065724d6567616279746546656555706461746564041c42616c616e63650c090120456d697473206f6e206368616e67696e67207468652073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e1c20506172616d7350202d206e657720646174612073697a65206665658053746f726167654275636b6574735065724261674c696d697455706461746564040c7536340cf820456d697473206f6e206368616e67696e6720746865202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742e1c20506172616d7330202d206e6577206c696d69749453746f726167654275636b657473566f75636865724d61784c696d69747355706461746564080c7536340c75363410f020456d697473206f6e206368616e67696e6720746865202253746f72616765206275636b65747320766f7563686572206d6178206c696d697473222e1c20506172616d7364202d206e6577206f626a656374732073697a65206c696d69746c202d206e6577206f626a65637473206e756d626572206c696d697440446174614f626a656374734d6f7665640c1442616749641442616749645842547265655365743c446174614f626a65637449643e14ac20456d697473206f6e206d6f76696e672064617461206f626a65637473206265747765656e20626167732e1c20506172616d7340202d20736f757263652062616720494454202d2064657374696e6174696f6e2062616720494448202d2064617461206f626a6563742049447348446174614f626a6563747344656c657465640c244163636f756e7449641442616749645842547265655365743c446174614f626a65637449643e14a820456d697473206f6e2064617461206f626a656374732064656c6574696f6e2066726f6d20626167732e1c20506172616d7390202d206163636f756e7420494420666f72207468652064656c6574696f6e207072697a6524202d2062616720494448202d2064617461206f626a656374204944736853746f726167654275636b657453746174757355706461746564083c53746f726167654275636b6574496410626f6f6c109c20456d697473206f6e2073746f72616765206275636b657420737461747573207570646174652e1c20506172616d7350202d2073746f72616765206275636b657420494434202d206e6577207374617475733c557064617465426c61636b6c697374083442547265655365743c4369643e3442547265655365743c4369643e10c820456d697473206f6e207570646174696e672074686520626c61636b6c69737420776974682064617461206861736865732e1c20506172616d7398202d2068617368657320746f2072656d6f76652066726f6d2074686520626c61636b6c69737484202d2068617368657320746f2061646420746f2074686520626c61636b6c6973744444796e616d696342616744656c6574656408244163636f756e7449643044796e616d69634261674964108420456d697473206f6e2064656c6574696e6720612064796e616d6963206261672e1c20506172616d7390202d206163636f756e7420494420666f72207468652064656c6574696f6e207072697a6544202d2064796e616d6963206261672049444444796e616d696342616743726561746564103044796e616d69634261674964e44f7074696f6e3c44796e616d696342616744656c6574696f6e5072697a655265636f72643c4163636f756e7449642c2042616c616e63653e3e6442547265655365743c53746f726167654275636b657449643e7842547265655365743c446973747269627574696f6e4275636b657449643e188420456d697473206f6e206372656174696e6720612064796e616d6963206261672e1c20506172616d7344202d2064796e616d696320626167204944b0202d206f7074696f6e616c2044796e616d696342616744656c6574696f6e5072697a6520696e7374616e636580202d2061737369676e65642073746f72616765206275636b657473272049447394202d2061737369676e656420646973747269627574696f6e206275636b657473272049447338566f75636865724368616e676564083c53746f726167654275636b657449641c566f756368657210d020456d697473206f6e206368616e67696e672074686520766f756368657220666f7220612073746f72616765206275636b65742e1c20506172616d7350202d2073746f72616765206275636b657420494438202d206e657720766f75636865725053746f726167654275636b657444656c65746564043c53746f726167654275636b657449640c8820456d697473206f6e2073746f72616765206275636b65742064656c6574696e672e1c20506172616d7350202d2073746f72616765206275636b6574204944dc4e756d6265724f6653746f726167654275636b657473496e44796e616d69634261674372656174696f6e506f6c69637955706461746564083844796e616d6963426167547970650c75363410410120456d697473206f6e207570646174696e6720746865206e756d626572206f662073746f72616765206275636b65747320696e2064796e616d696320626167206372656174696f6e20706f6c6963792e1c20506172616d734c202d2064796e616d696320626167207479706580202d206e6577206e756d626572206f662073746f72616765206275636b657473444261674f626a656374734368616e6765640c1442616749640c7536340c753634145420426167206f626a65637473206368616e6765642e1c20506172616d7324202d2062616720696464202d206e657720746f74616c206f626a656374732073697a656c202d206e657720746f74616c206f626a65637473206e756d6265727c446973747269627574696f6e4275636b657446616d696c79437265617465640468446973747269627574696f6e4275636b657446616d696c7949640cb820456d697473206f6e206372656174696e6720646973747269627574696f6e206275636b65742066616d696c792e1c20506172616d7380202d20646973747269627574696f6e2066616d696c79206275636b65742049447c446973747269627574696f6e4275636b657446616d696c7944656c657465640468446973747269627574696f6e4275636b657446616d696c7949640cb820456d697473206f6e2064656c6574696e6720646973747269627574696f6e206275636b65742066616d696c792e1c20506172616d7380202d20646973747269627574696f6e2066616d696c79206275636b657420494464446973747269627574696f6e4275636b6574437265617465640c68446973747269627574696f6e4275636b657446616d696c79496410626f6f6c50446973747269627574696f6e4275636b65744964149c20456d697473206f6e206372656174696e6720646973747269627574696f6e206275636b65742e1c20506172616d7380202d20646973747269627574696f6e206275636b65742066616d696c7920494454202d20616363657074696e67206e6577206261677364202d20646973747269627574696f6e206275636b65742049447c446973747269627574696f6e4275636b6574537461747573557064617465640850446973747269627574696f6e4275636b6574496410626f6f6c10f020456d697473206f6e2073746f72616765206275636b657420737461747573207570646174652028616363657074696e67206e65772062616773292e1c20506172616d7364202d20646973747269627574696f6e206275636b657420494488202d206e6577207374617475732028616363657074696e67206e657720626167732964446973747269627574696f6e4275636b657444656c657465640450446973747269627574696f6e4275636b657449640c9c20456d697473206f6e2064656c6574696e6720646973747269627574696f6e206275636b65742e1c20506172616d7364202d20646973747269627574696f6e206275636b657420494480446973747269627574696f6e4275636b65747355706461746564466f724261671014426167496468446973747269627574696f6e4275636b657446616d696c7949648442547265655365743c446973747269627574696f6e4275636b6574496e6465783e8442547265655365743c446973747269627574696f6e4275636b6574496e6465783e14c020456d697473206f6e207570646174696e6720646973747269627574696f6e206275636b65747320666f72206261672e1c20506172616d7324202d206261672049449c202d2073746f72616765206275636b65747320746f2061646420494420636f6c6c656374696f6ea8202d2073746f72616765206275636b65747320746f2072656d6f766520494420636f6c6c656374696f6e94446973747269627574696f6e4275636b6574735065724261674c696d697455706461746564040c7536340c0d0120456d697473206f6e206368616e67696e67207468652022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e1c20506172616d7330202d206e6577206c696d697474446973747269627574696f6e4275636b65744d6f6465557064617465640850446973747269627574696f6e4275636b6574496410626f6f6c10e420456d697473206f6e2073746f72616765206275636b6574206d6f6465207570646174652028646973747269627574696e6720666c6167292e1c20506172616d7364202d20646973747269627574696f6e206275636b65742049443c202d20646973747269627574696e67a446616d696c696573496e44796e616d69634261674372656174696f6e506f6c69637955706461746564083844796e616d696342616754797065a442547265654d61703c446973747269627574696f6e4275636b657446616d696c7949642c207533323e10310120456d697473206f6e2064796e616d696320626167206372656174696f6e20706f6c696379207570646174652028646973747269627574696f6e206275636b65742066616d696c696573292e1c20506172616d734c202d2064796e616d696320626167207479706578202d2066616d696c69657320616e64206275636b6574206e756d6265727384446973747269627574696f6e4275636b65744f70657261746f72496e76697465640850446973747269627574696f6e4275636b6574496420576f726b6572496410150120456d697473206f6e206372656174696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e1c20506172616d7364202d20646973747269627574696f6e206275636b657420494430202d20776f726b657220494494446973747269627574696f6e4275636b6574496e7669746174696f6e43616e63656c6c65640850446973747269627574696f6e4275636b6574496420576f726b6572496410190120456d697473206f6e2063616e63656c696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e1c20506172616d7364202d20646973747269627574696f6e206275636b657420494454202d206f70657261746f7220776f726b657220494490446973747269627574696f6e4275636b6574496e7669746174696f6e41636365707465640820576f726b6572496450446973747269627574696f6e4275636b6574496410190120456d697473206f6e20616363657074696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e1c20506172616d7330202d20776f726b657220494464202d20646973747269627574696f6e206275636b657420494474446973747269627574696f6e4275636b65744d657461646174615365740c20576f726b6572496450446973747269627574696f6e4275636b657449641c5665633c75383e14050120456d697473206f6e2073657474696e6720746865206d65746164617461206279206120646973747269627574696f6e206275636b6574206f70657261746f722e1c20506172616d7330202d20776f726b657220494464202d20646973747269627574696f6e206275636b65742049442c202d206d6574616461746184446973747269627574696f6e4275636b65744f70657261746f7252656d6f7665640850446973747269627574696f6e4275636b6574496420576f726b6572496410cc20456d697473206f6e2074686520646973747269627574696f6e206275636b6574206f70657261746f722072656d6f76616c2e1c20506172616d7364202d20646973747269627574696f6e206275636b657420494488202d20646973747269627574696f6e206275636b6574206f70657261746f722049448c446973747269627574696f6e4275636b657446616d696c794d657461646174615365740868446973747269627574696f6e4275636b657446616d696c7949641c5665633c75383e10fc20456d697473206f6e2073657474696e6720746865206d65746164617461206279206120646973747269627574696f6e206275636b65742066616d696c792e1c20506172616d7380202d20646973747269627574696f6e206275636b65742066616d696c792049442c202d206d657461646174615c53746f726167654f70657261746f7252656d61726b65640c20576f726b657249643c53746f726167654275636b657449641c5665633c75383e14a820456d697473206f6e2053746f72616765204f70657261746f72206d616b696e6720612072656d61726b1c20506172616d735c202d206f70657261746f72277320776f726b657220696450202d2073746f72616765206275636b657420696444202d2072656d61726b206d65737361676570446973747269627574696f6e4f70657261746f7252656d61726b65640c20576f726b6572496450446973747269627574696f6e4275636b657449641c5665633c75383e14bc20456d697473206f6e20446973747269627574696f6e204f70657261746f72206d616b696e6720612072656d61726b1c20506172616d735c202d206f70657261746f72277320776f726b657220696464202d20646973747269627574696f6e206275636b657420696444202d2072656d61726b206d657373616765245c446174614f626a65637444656c6574696f6e5072697a653042616c616e63654f663c543e400000000000000000000000000000000004d0204578706f72747320636f6e7374202d2061207072697a6520666f7220612064617461206f626a6563742064656c6574696f6e2e48426c61636b6c69737453697a654c696d69740c753634201027000000000000040501204578706f72747320636f6e7374202d206d6178696d756d2073697a65206f662074686520226861736820626c61636b6c6973742220636f6c6c656374696f6e2e8c53746f726167654275636b65747350657242616756616c7565436f6e73747261696e748c53746f726167654275636b65747350657242616756616c7565436f6e73747261696e744005000000000000000f0000000000000004f0204578706f72747320636f6e7374202d202253746f72616765206275636b6574732070657220626167222076616c756520636f6e73747261696e742eb444656661756c744d656d62657244796e616d69634261674e756d6265724f6653746f726167654275636b6574730c753634200500000000000000085101204578706f72747320636f6e7374202d207468652064656661756c742064796e616d696320626167206372656174696f6e20706f6c69637920666f72206d656d62657273202873746f72616765206275636b657424206e756d626572292eb844656661756c744368616e6e656c44796e616d69634261674e756d6265724f6653746f726167654275636b6574730c753634200500000000000000085501204578706f72747320636f6e7374202d207468652064656661756c742064796e616d696320626167206372656174696f6e20706f6c69637920666f72206368616e6e656c73202873746f72616765206275636b657424206e756d626572292e844d6178446973747269627574696f6e4275636b657446616d696c794e756d6265720c75363420c80000000000000004fc204578706f72747320636f6e7374202d206d617820616c6c6f77656420646973747269627574696f6e206275636b65742066616d696c79206e756d6265722ea0446973747269627574696f6e4275636b65747350657242616756616c7565436f6e73747261696e748c53746f726167654275636b65747350657242616756616c7565436f6e73747261696e744001000000000000006400000000000000040501204578706f72747320636f6e7374202d2022446973747269627574696f6e206275636b6574732070657220626167222076616c756520636f6e73747261696e742ec84d61784e756d6265724f6650656e64696e67496e7669746174696f6e73506572446973747269627574696f6e4275636b65740c753634201400000000000000042d01204578706f72747320636f6e7374202d206d6178206e756d626572206f662070656e64696e6720696e7669746174696f6e732070657220646973747269627574696f6e206275636b65742e444d6178446174614f626a65637453697a650c75363420000000800200000004bc204578706f72747320636f6e7374202d206d61782064617461206f626a6563742073697a6520696e2062797465732ee8444e6f4f626a656374734f6e55706c6f616404a420456d707479202264617461206f626a656374206372656174696f6e2220636f6c6c656374696f6e2e6053746f726167654275636b6574446f65736e74457869737404b020546865207265717565737465642073746f72616765206275636b657420646f65736e27742065786973742e7053746f726167654275636b657449734e6f74426f756e64546f42616704d020546865207265717565737465642073746f72616765206275636b6574206973206e6f7420626f756e6420746f2061206261672e6453746f726167654275636b65744973426f756e64546f42616704e020546865207265717565737465642073746f72616765206275636b657420697320616c726561647920626f756e6420746f2061206261672e644e6f53746f726167654275636b6574496e7669746174696f6e041d0120496e76616c6964206f7065726174696f6e207769746820696e76697465733a207468657265206973206e6f2073746f72616765206275636b657420696e7669746174696f6e2e6453746f7261676550726f7669646572416c726561647953657404090120496e76616c6964206f7065726174696f6e207769746820696e76697465733a2073746f726167652070726f76696465722077617320616c7265616479207365742e6053746f7261676550726f76696465724d757374426553657404782053746f726167652070726f7669646572206d757374206265207365742e7c446966666572656e7453746f7261676550726f7669646572496e766974656404190120496e76616c6964206f7065726174696f6e207769746820696e76697465733a20616e6f746865722073746f726167652070726f76696465722077617320696e76697465642e58496e766974656453746f7261676550726f766964657204190120496e76616c6964206f7065726174696f6e207769746820696e76697465733a2073746f726167652070726f76696465722077617320616c726561647920696e76697465642e8853746f726167654275636b65744964436f6c6c656374696f6e73417265456d70747904a42053746f72616765206275636b657420696420636f6c6c656374696f6e732061726520656d7074792e38456d707479436f6e74656e74496404b82055706c6f61642064617461206572726f723a20656d70747920636f6e74656e742049442070726f76696465642e385a65726f4f626a65637453697a6504942055706c6f61642064617461206572726f723a207a65726f206f626a6563742073697a652e84496e76616c696444656c6574696f6e5072697a65536f757263654163636f756e7404e82055706c6f61642064617461206572726f723a20696e76616c69642064656c6574696f6e207072697a6520736f75726365206163636f756e742e58496e76616c696453746f7261676550726f7669646572049420496e76616c69642073746f726167652070726f766964657220666f72206275636b65742e4c496e73756666696369656e7442616c616e6365049c20496e73756666696369656e742062616c616e636520666f7220616e206f7065726174696f6e2e54446174614f626a656374446f65736e744578697374046c2044617461206f626a65637420646f65736e27742065786973742e4055706c6f6164696e67426c6f636b656404a02055706c6f6164696e67206f6620746865206e6577206f626a65637420697320626c6f636b65642e74446174614f626a6563744964436f6c6c656374696f6e4973456d70747904902044617461206f626a65637420696420636f6c6c656374696f6e20697320656d7074792e80536f75726365416e6444657374696e6174696f6e42616773417265457175616c04a42043616e6e6f74206d6f7665206f626a656374732077697468696e207468652073616d65206261672e54446174614f626a656374426c61636b6c697374656404ac2044617461206f626a65637420686173682069732070617274206f662074686520626c61636b6c6973742e68426c61636b6c69737453697a654c696d69744578636565646564047c20426c61636b6c6973742073697a65206c696d69742065786365656465642e84566f75636865724d61784f626a65637453697a654c696d6974457863656564656404b0204d6178206f626a6563742073697a65206c696d697420657863656564656420666f7220766f75636865722e8c566f75636865724d61784f626a6563744e756d6265724c696d6974457863656564656404b8204d6178206f626a656374206e756d626572206c696d697420657863656564656420666f7220766f75636865722e9453746f726167654275636b65744f626a6563744e756d6265724c696d69745265616368656404d0204f626a656374206e756d626572206c696d697420666f72207468652073746f72616765206275636b657420726561636865642e8c53746f726167654275636b65744f626a65637453697a654c696d69745265616368656404e4204f626a6563747320746f74616c2073697a65206c696d697420666f72207468652073746f72616765206275636b657420726561636865642e6c496e73756666696369656e74547265617375727942616c616e636504dc20496e73756666696369656e74206d6f64756c652074726561737572792062616c616e636520666f7220616e206f7065726174696f6e2e8443616e6e6f7444656c6574654e6f6e456d70747953746f726167654275636b657404a82043616e6e6f742064656c6574652061206e6f6e2d656d7074792073746f72616765206275636b65742e68446174614f626a6563744964506172616d73417265456d70747904fc205468652060646174615f6f626a6563745f696473602065787472696e73696320706172616d6574657220636f6c6c656374696f6e20697320656d7074792e7c53746f726167654275636b6574735065724261674c696d6974546f6f4c6f7704dc20546865206e6577206053746f726167654275636b6574735065724261674c696d697460206e756d62657220697320746f6f206c6f772e8053746f726167654275636b6574735065724261674c696d6974546f6f4869676804e020546865206e6577206053746f726167654275636b6574735065724261674c696d697460206e756d62657220697320746f6f20686967682e8053746f726167654275636b65745065724261674c696d6974457863656564656404d0206053746f726167654275636b6574735065724261674c696d6974602077617320657863656564656420666f722061206261672e8053746f726167654275636b6574446f65736e744163636570744e65774261677304b0205468652073746f72616765206275636b657420646f65736e277420616363657074206e657720626167732e4044796e616d696342616745786973747304cc2043616e6e6f7420637265617465207468652064796e616d6963206261673a2064796e616d696320626167206578697374732e5444796e616d6963426167446f65736e744578697374046c2044796e616d69632062616720646f65736e27742065786973742e8853746f7261676550726f76696465724f70657261746f72446f65736e74457869737404a42053746f726167652070726f7669646572206f70657261746f7220646f65736e27742065786973742e484461746153697a654665654368616e67656404bc20496e76616c69642065787472696e7369632063616c6c3a20646174612073697a6520666565206368616e6765642e7843616e6e6f7444656c6574654e6f6e456d70747944796e616d696342616704942043616e6e6f742064656c657465206e6f6e20656d7074792064796e616d6963206261672eb84d6178446973747269627574696f6e4275636b657446616d696c794e756d6265724c696d6974457863656564656404d8204d617820646973747269627574696f6e206275636b65742066616d696c79206e756d626572206c696d69742065786365656465642e8c446973747269627574696f6e4275636b657446616d696c79446f65736e74457869737404a820446973747269627574696f6e206275636b65742066616d696c7920646f65736e27742065786973742e74446973747269627574696f6e4275636b6574446f65736e744578697374048c20446973747269627574696f6e206275636b657420646f65736e27742065786973742e9c446973747269627574696f6e4275636b65744964436f6c6c656374696f6e73417265456d70747904b820446973747269627574696f6e206275636b657420696420636f6c6c656374696f6e732061726520656d7074792e94446973747269627574696f6e4275636b6574446f65736e744163636570744e65774261677304b420446973747269627574696f6e206275636b657420646f65736e277420616363657074206e657720626167732eb84d6178446973747269627574696f6e4275636b65744e756d6265725065724261674c696d6974457863656564656404dc204d617820646973747269627574696f6e206275636b6574206e756d6265722070657220626167206c696d69742065786365656465642e84446973747269627574696f6e4275636b657449734e6f74426f756e64546f42616704ac20446973747269627574696f6e206275636b6574206973206e6f7420626f756e6420746f2061206261672e78446973747269627574696f6e4275636b65744973426f756e64546f426167049c20446973747269627574696f6e206275636b657420697320626f756e6420746f2061206261672e90446973747269627574696f6e4275636b6574735065724261674c696d6974546f6f4c6f7704f020546865206e65772060446973747269627574696f6e4275636b6574735065724261674c696d697460206e756d62657220697320746f6f206c6f772e94446973747269627574696f6e4275636b6574735065724261674c696d6974546f6f4869676804f420546865206e65772060446973747269627574696f6e4275636b6574735065724261674c696d697460206e756d62657220697320746f6f20686967682e9c446973747269627574696f6e50726f76696465724f70657261746f72446f65736e74457869737404b820446973747269627574696f6e2070726f7669646572206f70657261746f7220646f65736e27742065786973742ea8446973747269627574696f6e50726f76696465724f70657261746f72416c7265616479496e766974656404c020446973747269627574696f6e2070726f7669646572206f70657261746f7220616c726561647920696e76697465642e7c446973747269627574696f6e50726f76696465724f70657261746f7253657404b020446973747269627574696f6e2070726f7669646572206f70657261746f7220616c7265616479207365742e784e6f446973747269627574696f6e4275636b6574496e7669746174696f6e048c204e6f20646973747269627574696f6e206275636b657420696e7669746174696f6e2eac4d7573744265446973747269627574696f6e50726f76696465724f70657261746f72466f724275636b6574042d0120496e76616c6964206f7065726174696f6e733a206d757374206265206120646973747269627574696f6e2070726f7669646572206f70657261746f7220666f722061206275636b65742ef84d61784e756d6265724f6650656e64696e67496e7669746174696f6e734c696d6974466f72446973747269627574696f6e4275636b657452656163686564042d01204d6178206e756d626572206f662070656e64696e6720696e7669746174696f6e73206c696d697420666f72206120646973747269627574696f6e206275636b657420726561636865642ea8446973747269627574696f6e46616d696c79426f756e64546f4261674372656174696f6e506f6c69637904d020446973747269627574696f6e2066616d696c7920626f756e6420746f206120626167206372656174696f6e20706f6c6963792e644d6178446174614f626a65637453697a654578636565646564047c204d61782064617461206f626a6563742073697a652065786365656465642e4c4163636f756e74734e6f74436f686572656e7404090120446966666572656e74204163636f756e747320666f722064796e616d6963206261672064656c6574696f6e207072697a6520616e642075706c6f616420666565733c426167734e6f74436f686572656e7404f020446966666572656e74204163636f756e747320666f722064796e616d69632062616720696420616e6420706172616d65746572732062616720696460496e76616c69645472616e736163746f724163636f756e7404bc20496e76616c6964207472616e736163746f72206163636f756e7420494420666f722074686973206275636b65742e1a3c50726f706f73616c73456e67696e65013850726f706f73616c456e67696e65142450726f706f73616c7301010234543a3a50726f706f73616c49643450726f706f73616c4f663c543e000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460204d61702070726f706f73616c206279206974732069642e3450726f706f73616c436f756e7401000c753332100000000004bc20436f756e74206f6620616c6c2070726f706f73616c7320746861742068617665206265656e20637265617465642e50446973706174636861626c6543616c6c436f646501010234543a3a50726f706f73616c49641c5665633c75383e00040004b4204d61702070726f706f73616c2065786563757461626c6520636f64652062792070726f706f73616c2069642e4c41637469766550726f706f73616c436f756e7401000c7533321000000000046c20436f756e74206f66206163746976652070726f706f73616c732e6c566f7465457869737473427950726f706f73616c4279566f74657201020234543a3a50726f706f73616c49642c4d656d62657249643c543e20566f74654b696e6402040104290120446f75626c65206d617020666f722070726576656e74696e67206475706c696361746520766f7465732e2053686f756c6420626520636c65616e65642061667465722075736167652e011010766f74651020766f7465725f69642c4d656d62657249643c543e2c70726f706f73616c5f696434543a3a50726f706f73616c496410766f746520566f74654b696e6424726174696f6e616c651c5665633c75383e28d820566f74652065787472696e7369632e20436f6e646974696f6e733a20206f726967696e206d75737420616c6c6f7720766f7465732e0024203c7765696768743e0028202323205765696768743c20604f20285229602077686572653a8c202d2060526020697320746865206c656e677468206f662060726174696f6e616c656018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f722070617261656d74657273302023203c2f7765696768743e3c63616e63656c5f70726f706f73616c082c70726f706f7365725f69642c4d656d62657249643c543e2c70726f706f73616c5f696434543a3a50726f706f73616c496428b02043616e63656c20612070726f706f73616c20627920697473206f726967696e616c2070726f706f7365722e0024203c7765696768743e0028202323205765696768743c20604f20284c29602077686572653ac4202d20604c602069732074686520746f74616c206e756d626572206f66206c6f636b7320696e206042616c616e6365736018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e347665746f5f70726f706f73616c042c70726f706f73616c5f696434543a3a50726f706f73616c4964247c205665746f20612070726f706f73616c2e204d75737420626520726f6f742e0024203c7765696768743e002820232320576569676874c820604f202831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c70726f706f7365725f72656d61726b0c2c70726f706f73616c5f696434543a3a50726f706f73616c49642c70726f706f7365725f69642c4d656d62657249643c543e0c6d73671c5665633c75383e24402050726f706f7365722052656d61726b0024203c7765696768743e002820232320576569676874c820604f202831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d657465727318202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e01185450726f706f73616c53746174757355706461746564082850726f706f73616c49646c50726f706f73616c5374617475733c426c6f636b4e756d6265723e107020456d697473206f6e2070726f706f73616c206372656174696f6e2e2020506172616d733a50202d204964206f6620612070726f706f73616c2e5c202d204e65772070726f706f73616c207374617475732e5050726f706f73616c4465636973696f6e4d616465082850726f706f73616c49644050726f706f73616c4465636973696f6e10b420456d697473206f6e2067657474696e6720612070726f706f73616c20737461747573206465636973696f6e2e2020506172616d733a50202d204964206f6620612070726f706f73616c2e50202d2050726f706f73616c206465636973696f6e4050726f706f73616c4578656375746564082850726f706f73616c49643c457865637574696f6e537461747573107420456d697473206f6e2070726f706f73616c20657865637574696f6e2e2020506172616d733a70202d204964206f66206120757064617465642070726f706f73616c2e74202d2050726f706f73616c20657865637574696f6e207374617475732e14566f74656410204d656d62657249642850726f706f73616c496420566f74654b696e641c5665633c75383e188420456d697473206f6e20766f74696e6720666f72207468652070726f706f73616c2020506172616d733a80202d20566f746572202d206d656d626572206964206f66206120766f7465722e50202d204964206f6620612070726f706f73616c2e40202d204b696e64206f6620766f74652e34202d20526174696f6e616c652e4450726f706f73616c43616e63656c6c656408204d656d62657249642850726f706f73616c4964109020456d697473206f6e20612070726f706f73616c206265696e672063616e63656c6c65642020506172616d733a70202d204d656d626572204964206f66207468652070726f706f73657254202d204964206f66207468652070726f706f73616c4050726f706f73657252656d61726b65640c204d656d62657249642850726f706f73616c49641c5665633c75383e108820456d697473206f6e2070726f706f736572206d616b696e6720612072656d61726b38202d2070726f706f73657220696438202d2070726f706f73616c20696428202d206d657373616765183c43616e63656c6c6174696f6e4665653042616c616e63654f663c543e4010270000000000000000000000000000047901204578706f72747320636f6e7374202d2074686520666565206973206170706c696564207768656e2063616e63656c207468652070726f706f73616c2e20412066656520776f756c6420626520736c617368656420286275726e6564292e3052656a656374696f6e4665653042616c616e63654f663c543e4088130000000000000000000000000000084501204578706f72747320636f6e7374202d202074686520666565206973206170706c696564207768656e207468652070726f706f73616c20676574732072656a65637465642e20412066656520776f756c645420626520736c617368656420286275726e6564292e385469746c654d61784c656e6774680c753332102800000004d0204578706f72747320636f6e7374202d20206d617820616c6c6f7765642070726f706f73616c207469746c65206c656e6774682e504465736372697074696f6e4d61784c656e6774680c75333210b80b000004e8204578706f72747320636f6e7374202d20206d617820616c6c6f7765642070726f706f73616c206465736372697074696f6e206c656e6774682e584d617841637469766550726f706f73616c4c696d69740c753332101400000004ec204578706f72747320636f6e7374202d20206d61782073696d756c74616e656f7573206163746976652070726f706f73616c73206e756d6265722e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722070726f706f73616c04a4204578706f72747320636f6e7374202d207374616b696e672068616e646c6572206c6f636b2069642e5448456d7074795469746c6550726f766964656404942050726f706f73616c2063616e6e6f74206861766520616e20656d707479207469746c652260456d7074794465736372697074696f6e50726f7669646564048c2050726f706f73616c2063616e6e6f74206861766520616e20656d70747920626f6479385469746c654973546f6f4c6f6e670448205469746c6520697320746f6f206c6f6e67504465736372697074696f6e4973546f6f4c6f6e670460204465736372697074696f6e20697320746f6f206c6f6e674050726f706f73616c4e6f74466f756e640470205468652070726f706f73616c20646f6573206e6f742065786973744450726f706f73616c46696e616c697a656404782050726f706f73616c2069732066696e616c697a656420616c726561647930416c7265616479566f74656404a0205468652070726f706f73616c2068617665206265656e20616c726561647920766f746564206f6e244e6f74417574686f720438204e6f7420616e20617574686f727c4d617841637469766550726f706f73616c4e756d62657245786365656465640494204d6178206163746976652070726f706f73616c73206e756d62657220657863656564656428456d7074795374616b6504a4205374616b652063616e6e6f7420626520656d707479207769746820746869732070726f706f73616c485374616b6553686f756c644265456d70747904a0205374616b652073686f756c6420626520656d70747920666f7220746869732070726f706f73616c605374616b654469666665727346726f6d526571756972656404b4205374616b6520646966666572732066726f6d207468652070726f706f73616c20726571756972656d656e747384496e76616c6964506172616d65746572417070726f76616c5468726573686f6c64048820417070726f76616c207468726573686f6c642063616e6e6f74206265207a65726f84496e76616c6964506172616d65746572536c617368696e675468726573686f6c64048820536c617368696e67207468726573686f6c642063616e6e6f74206265207a65726f4452657175697265526f6f744f726967696e0488205265717569726520726f6f74206f726967696e20696e2065787472696e736963734050726f706f73616c486173566f74657304f820446973616c6c6f7720746f2063616e63656c207468652070726f706f73616c2069662074686572652061726520616e7920766f746573206f6e2069742e5c5a65726f4578616374457865637574696f6e426c6f636b049820457861637420657865637574696f6e20626c6f636b2063616e6e6f74206265207a65726f2e68496e76616c69644578616374457865637574696f6e426c6f636b04e420457861637420657865637574696f6e20626c6f636b2063616e6e6f74206265206c657373207468616e2063757272656e745f626c6f636b2e6c496e73756666696369656e7442616c616e6365466f725374616b6504a4205468657265206973206e6f7420656e6f7567682062616c616e636520666f722061207374616b652e44436f6e666c696374696e675374616b657304c02054686520636f6e666c696374696e67207374616b6520646973636f76657265642e2043616e6e6f74207374616b652e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e1b4c50726f706f73616c7344697363757373696f6e014850726f706f73616c44697363757373696f6e1028546872656164427949640101022c543a3a5468726561644964e844697363757373696f6e5468726561643c4d656d62657249643c543e2c20543a3a426c6f636b4e756d6265722c204d656d62657249643c543e3e00340000000000000000000000000004bc204d617020746872656164206964656e74696669657220746f20636f72726573706f6e64696e67207468726561642e2c546872656164436f756e7401000c75363420000000000000000004b420436f756e74206f6620616c6c207468726561647320746861742068617665206265656e20637265617465642e50506f737454687265616449644279506f737449640102022c543a3a546872656164496424543a3a506f73744964e444697363757373696f6e506f73743c4d656d62657249643c543e2c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e02700000000000000000000000000000000000000000000000000000000004c4204d61702074687265616420696420616e6420706f737420696420746f20636f72726573706f6e64696e6720706f73742e24506f7374436f756e7401000c75363420000000000000000004ac20436f756e74206f6620616c6c20706f73747320746861742068617665206265656e20637265617465642e0110206164645f706f73741038706f73745f617574686f725f69642c4d656d62657249643c543e247468726561645f69642c543a3a546872656164496410746578741c5665633c75383e206564697461626c6510626f6f6c28982041646473206120706f7374207769746820617574686f72206f726967696e20636865636b2e0024203c7765696768743e0028202323205765696768743c20604f20284c29602077686572653a78202d20604c6020697320746865206c656e677468206f662060746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c64656c6574655f706f7374102864656c657465725f69642c4d656d62657249643c543e1c706f73745f696424543a3a506f73744964247468726561645f69642c543a3a5468726561644964106869646510626f6f6c2855012052656d6f766520706f73742066726f6d2073746f726167652c207769746820746865206c61737420706172616d6574657220696e6469636174696e67207768657468657220746f20616c736f20686964652069742c20696e207468652055492e0024203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c7570646174655f706f73740c247468726561645f69642c543a3a54687265616449641c706f73745f696424543a3a506f7374496410746578741c5665633c75383e2831012055706461746573206120706f7374207769746820617574686f72206f726967696e20636865636b2e2055706461746520617474656d707473206e756d626572206973206c696d697465642e0024203c7765696768743e0028202323205765696768743c20604f20284c29602077686572653a78202d20604c6020697320746865206c656e677468206f662060746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e486368616e67655f7468726561645f6d6f64650c246d656d6265725f69642c4d656d62657249643c543e247468726561645f69642c543a3a5468726561644964106d6f64655c5468726561644d6f64653c4d656d62657249643c543e3e2880204368616e67657320746872656164207065726d697373696f6e206d6f64652e0024203c7765696768743e002820232320576569676874e020604f2028572960206966205468726561644d6f646520697320636c6f7365206f72204f283129206f74686572776973652077686572653ad4202d2060576020697320746865206e756d626572206f662077686974656c6973746564206d656d6265727320696e20606d6f64656018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0114345468726561644372656174656408205468726561644964204d656d6265724964046820456d697473206f6e20746872656164206372656174696f6e2e2c506f7374437265617465641418506f73744964204d656d62657249642054687265616449641c5665633c75383e10626f6f6c046020456d697473206f6e20706f7374206372656174696f6e2e2c506f7374557064617465641018506f73744964204d656d62657249642054687265616449641c5665633c75383e045820456d697473206f6e20706f7374207570646174652e445468726561644d6f64654368616e6765640c205468726561644964505468726561644d6f64653c4d656d62657249643e204d656d6265724964047420456d697473206f6e20746872656164206d6f6465206368616e67652e2c506f737444656c6574656410204d656d626572496420546872656164496418506f7374496410626f6f6c045820456d697473206f6e20706f73742064656c657465640c404d617857686974654c69737453697a650c7533321014000000040901204578706f72747320636f6e7374202d20617574686f72206c6973742073697a65206c696d697420666f722074686520436c6f7365642064697363757373696f6e2e2c506f73744465706f7369743042616c616e63654f663c543e40d007000000000000000000000000000004a0204578706f72747320636f6e7374202d2066656520666f72206372656174696e67206120706f737430506f73744c69666554696d6538543a3a426c6f636b4e756d62657210100e0000043d01204578706f72747320636f6e7374202d206d6178696d756d206e756d626572206f6620626c6f636b73206265666f7265206120706f73742063616e2062652065726173656420627920616e796f6e652044546872656164446f65736e74457869737404542054687265616420646f65736e27742065786973743c506f7374446f65736e744578697374044c20506f737420646f65736e27742065786973744452657175697265526f6f744f726967696e0488205265717569726520726f6f74206f726967696e20696e2065787472696e736963736043616e6e6f74506f73744f6e436c6f73656454687265616404690120546865207468726561642068617320436c6f736564206d6f64652e20416e6420706f737420617574686f7220646f65736e27742062656c6f6e6720746f20636f756e63696c206f7220616c6c6f776564206d656d626572732e504e6f74417574686f724f72436f756e63696c6f7204982053686f756c642062652074687265616420617574686f72206f7220636f756e63696c6f722e604d617857686974654c69737453697a65457863656564656404a4204d617820616c6c6f77656420617574686f7273206c697374206c696d69742065786365656465642e68496e73756666696369656e7442616c616e6365466f72506f737404c8204163636f756e742068617320696e73756666696369656e742062616c616e636520746f20637265617465206120706f73744043616e6e6f7444656c657465506f737404a0204163636f756e742063616e27742064656c65746520706f737420617420746865206d6f6d656e741c3850726f706f73616c73436f646578013450726f706f73616c436f64657804505468726561644964427950726f706f73616c496401010234543a3a50726f706f73616c49642c543a3a54687265616449640020000000000000000004b0204d61702070726f706f73616c20696420746f206974732064697363757373696f6e2074687265616420696401043c6372656174655f70726f706f73616c086c67656e6572616c5f70726f706f73616c5f706172616d65746572737047656e6572616c50726f706f73616c506172616d65746572733c543e4070726f706f73616c5f64657461696c735050726f706f73616c44657461696c734f663c543e3049012043726561746520612070726f706f73616c2c207468652074797065206f662070726f706f73616c20646570656e6473206f6e20746865206070726f706f73616c5f64657461696c73602076617269616e740024203c7765696768743e0028202323205765696768745c20604f202854202b2044202b204929602077686572653a84202d2060546020697320746865206c656e677468206f6620746865207469746c659c202d2060446020697320746865206c656e677468206f6620746865206465736372697074696f6eec202d2060496020697320746865206c656e677468206f6620616e7920706172616d6574657220696e206070726f706f73616c5f64657461696c736018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e01043c50726f706f73616c43726561746564102850726f706f73616c49646447656e6572616c50726f706f73616c506172616d65746572734450726f706f73616c44657461696c734f66205468726561644964185c20412070726f706f73616c2077617320637265617465642020506172616d733a0101202d204964206f662061206e65776c7920637265617465642070726f706f73616c2061667465722069742077617320736176656420696e2073746f726167652e0501202d2047656e6572616c2070726f706f73616c20706172616d657465722e20506172616d65746572732073686172656420627920616c6c2070726f706f73616c734d01202d2050726f706f73616c2044657461696c732e20506172616d65746572206f662070726f706f73616c207769746820612076617269616e7420666f722065616368206b696e64206f662070726f706f73616ca0202d204964206f662061206e65776c7920637265617465642070726f706f73616c2074687265616464985365744d617856616c696461746f72436f756e7450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a800000000000042000000500000003c0000005000000001a08601000000000000000000000000000100000004dc204578706f7274732027536574204d61782056616c696461746f7220436f756e74272070726f706f73616c20706172616d65746572732e8052756e74696d655570677261646550726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4807000004038000050000000640000003c0000005000000001809698000000000000000000000000000100000004bc204578706f727473202752756e74696d652055706772616465272070726f706f73616c20706172616d65746572732e605369676e616c50726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a8610000000000000000000000000000010000000498204578706f72747320275369676e616c272070726f706f73616c20706172616d65746572732e8046756e64696e675265717565737450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a86100000000000000000000000000000100000004bc204578706f727473202746756e64696e672052657175657374272070726f706f73616c20706172616d65746572732ebc437265617465576f726b696e6747726f75704c6561644f70656e696e6750726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a086010000000000000000000000000001000000040501204578706f727473202743726561746520576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732ea446696c6c576f726b696e6747726f75704f70656e696e6750726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004fc204578706f727473202746696c6c20576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732ea8557064617465576f726b696e6747726f757042756467657450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004ec204578706f727473202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20706172616d65746572732ebc4465637265617365576f726b696e6747726f75704c6561645374616b6550726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c3000000000000000000000000000001000000040501204578706f7274732027446563726561736520576f726b696e672047726f7570204c656164205374616b65272070726f706f73616c20706172616d65746572732e9c536c617368576f726b696e6747726f75704c65616450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004e0204578706f7274732027536c61736820576f726b696e672047726f7570204c656164272070726f706f73616c20706172616d65746572732eac536574576f726b696e6747726f75704c65616452657761726450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004f4204578706f727473202753657420576f726b696e672047726f7570204c65616420526577617264272070726f706f73616c20706172616d65746572732eac5465726d696e617465576f726b696e6747726f75704c65616450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4081a01000000000042000000500000003c0000005000000001a08601000000000000000000000000000100000004f0204578706f72747320275465726d696e61746520576f726b696e672047726f7570204c656164272070726f706f73616c20706172616d65746572732e8c416d656e64436f6e737469747574696f6e50726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4081a01004038000050000000640000003c000000500000000140420f000000000000000000000000000200000004c8204578706f7274732027416d656e6420436f6e737469747574696f6e272070726f706f73616c20706172616d65746572732ebc43616e63656c576f726b696e6747726f75704c6561644f70656e696e6750726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c3000000000000000000000000000001000000040501204578706f727473202743616e63656c20576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732e905365744d656d62657273686970507269636550726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004d0204578706f7274732027536574204d656d62657273686970205072696365272070726f706f73616c20706172616d65746572732eac536574436f756e63696c427564676574496e6372656d656e7450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4401901004038000042000000500000003c0000005000000001400d03000000000000000000000000000100000004f0204578706f727473206053657420436f756e63696c2042756467657420496e6372656d656e74602070726f706f73616c20706172616d65746572732e90536574436f756e63696c6f7252657761726450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100c089010042000000500000003c0000005000000001400d030000000000000000000000000002000000042101204578706f727473206053657420436f756e63696c6f72205265776172642050726f706f73616c20506172616d6574657273602070726f706f73616c20706172616d65746572732eb4536574496e697469616c496e7669746174696f6e42616c616e636550726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000004f8204578706f727473206053657420496e697469616c20496e7669746174696f6e2042616c616e6365602070726f706f73616c20706172616d65746572732e90536574496e7669746174696f6e436f756e7450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c0000004b0000003c000000500000000150c300000000000000000000000000000100000000c85365744d656d626572736869704c656164496e7669746174696f6e51756f746150726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c0000004b0000003c000000500000000150c30000000000000000000000000000010000000080536574526566657272616c43757450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0a80000000000003c0000004b0000003c000000500000000150c30000000000000000000000000000010000000080437265617465426c6f67506f737450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a861000000000000000000000000000001000000007845646974426c6f67506f737450726f6f706f73616c506172616d74657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a86100000000000000000000000000000100000000784c6f636b426c6f67506f737450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a8610000000000000000000000000000010000000080556e6c6f636b426c6f67506f737450726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb440190100000000003c000000500000003c0000005000000001a86100000000000000000000000000000100000000785665746f50726f706f73616c50726f706f73616c506172616d6574657273c050726f706f73616c506172616d65746572733c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3eb4c0890100000000004b000000500000003c000000420000000140420f00000000000000000000000000010000000050545369676e616c50726f706f73616c4973456d70747904a42050726f7669646564207465787420666f7220746578742070726f706f73616c20697320656d7074795852756e74696d6550726f706f73616c4973456d70747904f42050726f7669646564205741534d20636f646520666f72207468652072756e74696d6520757067726164652070726f706f73616c20697320656d70747990496e76616c696446756e64696e675265717565737450726f706f73616c42616c616e636504c020496e76616c69642062616c616e63652076616c756520666f7220746865207370656e64696e672070726f706f73616c54496e76616c696456616c696461746f72436f756e7404fc20496e76616c69642076616c696461746f7220636f756e7420666f722074686520277365742076616c696461746f7220636f756e74272070726f706f73616c4452657175697265526f6f744f726967696e0488205265717569726520726f6f74206f726967696e20696e2065787472696e73696373a8496e76616c6964436f756e63696c456c656374696f6e506172616d65746572436f756e63696c53697a6504c820496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20636f756e63696c5f73697a65b4496e76616c6964436f756e63696c456c656374696f6e506172616d6574657243616e6469646163794c696d697404d420496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d2063616e6469646163792d6c696d6974b4496e76616c6964436f756e63696c456c656374696f6e506172616d657465724d696e566f74696e675374616b6504d820496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206d696e2d766f74696e675f7374616b65b8496e76616c6964436f756e63696c456c656374696f6e506172616d657465724e65775465726d4475726174696f6e04dc20496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206e65775f7465726d5f6475726174696f6eb8496e76616c6964436f756e63696c456c656374696f6e506172616d657465724d696e436f756e63696c5374616b6504dc20496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206d696e5f636f756e63696c5f7374616b65b8496e76616c6964436f756e63696c456c656374696f6e506172616d6574657252657665616c696e67506572696f6404d820496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d2072657665616c696e675f706572696f64ac496e76616c6964436f756e63696c456c656374696f6e506172616d65746572566f74696e67506572696f6404cc20496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20766f74696e675f706572696f64bc496e76616c6964436f756e63696c456c656374696f6e506172616d65746572416e6e6f756e63696e67506572696f6404dc20496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20616e6e6f756e63696e675f706572696f6484496e76616c6964576f726b696e6747726f7570427564676574436170616369747904c020496e76616c696420776f726b696e672067726f75702062756467657420636170616369747920706172616d65746572a0496e76616c69645365744c656164506172616d6574657243616e6e6f744265436f756e63696c6f7204310120496e76616c69642027736574206c6561642070726f706f73616c2720706172616d65746572202d2070726f706f736564206c6561642063616e6e6f74206265206120636f756e63696c6f724c536c617368696e675374616b6549735a65726f04250120496e76616c69642027736c617368207374616b652070726f706f73616c2720706172616d65746572202d2063616e6e6f7420736c617368206279207a65726f2062616c616e63652e5444656372656173696e675374616b6549735a65726f043d0120496e76616c696420276465637265617365207374616b652070726f706f73616c2720706172616d65746572202d2063616e6e6f74206465637265617365206279207a65726f2062616c616e63652e80496e73756666696369656e7446756e6473466f7242756467657455706461746504210120496e73756666696369656e742066756e647320666f72202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20657865637574696f6eb0496e76616c696446756e64696e675265717565737450726f706f73616c4e756d6265724f664163636f756e7404550120496e76616c6964206e756d626572206f66206163636f756e747320726563696576696e672066756e64696e67207265717565737420666f72202746756e64696e672052657175657374272070726f706f73616c2eb0496e76616c696446756e64696e675265717565737450726f706f73616c52657065617465644163636f756e7404c0205265706561746564206163636f756e7420696e202746756e64696e672052657175657374272070726f706f73616c2e1d44466f72756d576f726b696e6747726f75700154496e7374616e636531576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332104a38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d666f72756d0464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e1e4c53746f72616765576f726b696e6747726f75700154496e7374616e636532576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332105438000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d73746f72670464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e1f4c436f6e74656e74576f726b696e6747726f75700154496e7374616e636533576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332105e38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d636f6e74740464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e206c4f7065726174696f6e73576f726b696e6747726f7570416c7068610154496e7374616e636534576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332107c38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d6f706572610464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e214c47617465776179576f726b696e6747726f75700154496e7374616e636535576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332107238000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d67617465770464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e22584d656d62657273686970576f726b696e6747726f75700154496e7374616e636536576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332106838000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d6d656d62720464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e23684f7065726174696f6e73576f726b696e6747726f7570426574610154496e7374616e636537576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332108638000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d6f706572620464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e246c4f7065726174696f6e73576f726b696e6747726f757047616d6d610154496e7374616e636538576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332109038000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d6f706572670464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e2560446973747269627574696f6e576f726b696e6747726f75700154496e7374616e636539576f726b696e6747726f757030344e6578744f70656e696e6749640100244f70656e696e67496420000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e6742794964010102244f70656e696e674964944f70656e696e673c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e00ac010000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e7401000c7533321000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e42794964010102344170706c69636174696f6e4964384170706c69636174696f6e3c543e00c501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e49640100344170706c69636174696f6e496420000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b6572496401002c576f726b657249643c543e2000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640101022c576f726b657249643c543e24576f726b65723c543e00cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c65616400002c576f726b657249643c543e040004502043757272656e742067726f7570206c6561642e1842756467657401003042616c616e63654f663c543e400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e38537461747573546578744861736801001c5665633c75383e0400044820537461747573207465787420686173682e34576f726b657253746f726167650101022c576f726b657249643c543e1c5665633c75383e00040004c4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722073746f726167652e44576f726b657253746f7261676553697a6501000c753136080008048420576f726b65722073746f726167652073697a6520757070657220626f756e642e014c2c6164645f6f70656e696e67102c6465736372697074696f6e1c5665633c75383e306f70656e696e675f747970652c4f70656e696e6754797065307374616b655f706f6c696379a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e2cc8204164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e4d012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a94202d2060446020697320746865206c656e677468206f6620606465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e406170706c795f6f6e5f6f70656e696e670404706c4170706c794f6e4f70656e696e67506172616d65746572733c543e286c204170706c79206f6e206120776f726b6572206f70656e696e672e002c2023203c7765696768743e0028202323205765696768743c20604f20284429602077686572653a9c202d2060446020697320746865206c656e677468206f662060702e6465736372697074696f6e6018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3066696c6c5f6f70656e696e6708286f70656e696e675f6964244f70656e696e674964687375636365737366756c5f6170706c69636174696f6e5f6964735c42547265655365743c4170706c69636174696f6e49643e28b02046696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e51012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2c2023203c7765696768743e0028202323205765696768743c20604f20284129602077686572653ad0202d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f6964736018202d2044423a28202020202d204f284129302023203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e740824776f726b65725f69642c576f726b657249643c543e4c6e65775f726f6c655f6163636f756e745f696430543a3a4163636f756e7449642419012055706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e286c656176655f726f6c650824776f726b65725f69642c576f726b657249643c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2094204c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e387465726d696e6174655f726f6c650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c7479504f7074696f6e3c42616c616e63654f663c543e3e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28a4205465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653abc202d2060506020697320746865206c656e677468206f66206070656e616c74792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e2c736c6173685f7374616b650c24776f726b65725f69642c576f726b657249643c543e1c70656e616c74793042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e2c810120536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e410120496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e1d01205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2c2023203c7765696768743e0028202323205765696768743c20604f20285029602077686572653ac0202d2060506020697320746865206c656e677468206f66206070656e616c6974792e736c617368696e675f746578746018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3864656372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e302501204465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653d0120776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e98204163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e2901205265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e38696e6372656173655f7374616b650824776f726b65725f69642c576f726b657249643c543e4c7374616b655f62616c616e63655f64656c74613042616c616e63654f663c543e28090120496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e7101204c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e5077697468647261775f6170706c69636174696f6e04386170706c69636174696f6e5f6964344170706c69636174696f6e49642405012057697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3863616e63656c5f6f70656e696e6704286f70656e696e675f6964244f70656e696e67496428e02043616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e59012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e287365745f62756467657404286e65775f6275646765743042616c616e63654f663c543e28a420536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e547570646174655f7265776172645f6163636f756e740824776f726b65725f69642c576f726b657249643c543e546e65775f7265776172645f6163636f756e745f696430543a3a4163636f756e744964246d01205570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e507570646174655f7265776172645f616d6f756e740824776f726b65725f69642c576f726b657249643c543e407265776172645f7065725f626c6f636b504f7074696f6e3c42616c616e63654f663c543e3e28cc2055706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e35012052657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e3c7365745f7374617475735f74657874042c7374617475735f746578743c4f7074696f6e3c5665633c75383e3e30b820536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e5820526571756972657320726f6f74206f726967696e2e002c2023203c7765696768743e0028202323205765696768743c20604f20285329602077686572653a2501202d2060536020697320746865206c656e677468206f662074686520636f6e74656e7473206f6620607374617475735f7465787460207768656e206974206973206e6f74206e6f6e650018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e447370656e645f66726f6d5f6275646765740c286163636f756e745f696430543a3a4163636f756e74496418616d6f756e743042616c616e63654f663c543e24726174696f6e616c653c4f7074696f6e3c5665633c75383e3e28ac205472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e60205265717569726573206c6561646572206f726967696e2e002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e4c7570646174655f726f6c655f73746f726167650824776f726b65725f69642c576f726b657249643c543e1c73746f726167651c5665633c75383e04902055706461746520746865206173736f63696174656420726f6c652073746f726167652e2c6c6561645f72656d61726b040c6d73671c5665633c75383e2450204c6561642072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e34776f726b65725f72656d61726b0824776f726b65725f69642c576f726b657249643c543e0c6d73671c5665633c75383e245820576f726b65722072656d61726b206d657373616765002c2023203c7765696768743e0028202323205765696768742020604f202831296018202d2044423ad0202020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273302023203c2f7765696768743e0164304f70656e696e67416464656414244f70656e696e6749641c5665633c75383e2c4f70656e696e67547970652c5374616b65506f6c6963793c4f7074696f6e3c42616c616e63653e1c8420456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696438202d204465736372697074696f6e7c202d204f70656e696e672054797065284c656164206f7220576f726b6572297c202d205374616b6520506f6c69637920666f7220746865206f70656e696e674c202d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e6708604170706c794f6e4f70656e696e67506172616d6574657273344170706c69636174696f6e496410e020456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e2020506172616d733a58202d204f70656e696e6720706172616d65746572657344202d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c244f70656e696e674964684170706c69636174696f6e4964546f576f726b657249644d61705c42547265655365743c4170706c69636174696f6e49643e148820456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e2020506172616d733a50202d20576f726b6572206f70656e696e67206964d0202d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279b0202d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740420576f726b657249640c8c20456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e2020506172616d733a4c202d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640820576f726b65724964244163636f756e74496410c820456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e84202d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e73657400048020456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640420576f726b65724964107420456d697473206f6e2065786974696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e34202d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670820576f726b657249643c4f7074696f6e3c5665633c75383e3e10b820456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e2020506172616d733a34202d20576f726b65722069642e34202d20526174696f6e616c652e405465726d696e61746564576f726b65720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e672074686520776f726b65722e2020506172616d733a34202d20776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e405465726d696e617465644c65616465720c20576f726b657249643c4f7074696f6e3c42616c616e63653e3c4f7074696f6e3c5665633c75383e3e148420456d697473206f6e207465726d696e6174696e6720746865206c65616465722e2020506172616d733a50202d206c656164657220776f726b65722069642e2c202d2050656e616c74792e34202d20526174696f6e616c652e305374616b65536c61736865641020576f726b657249641c42616c616e63651c42616c616e63653c4f7074696f6e3c5665633c75383e3e18c420456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e68202d2061637475616c20736c61736865642062616c616e63652e74202d2052657175657374656420736c61736865642062616c616e63652e34202d20526174696f6e616c652e385374616b654465637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640820576f726b657249641c42616c616e636510cc20456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e2020506172616d733a68202d20726567756c617220776f726b65722f6c6561642069642e54202d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04344170706c69636174696f6e49640c290120456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e2020506172616d733a54202d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404244f70656e696e6749640c9020456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e2020506172616d733a34202d204f70656e696e6720696424427564676574536574041c42616c616e63650ccc20456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e2020506172616d733a34202d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640820576f726b65724964244163636f756e74496410d020456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e8c202d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640820576f726b657249643c4f7074696f6e3c42616c616e63653e10cc20456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e2020506172616d733a50202d204964206f662074686520776f726b65722e4c202d205265776172642070657220626c6f636b44537461747573546578744368616e676564081c5665633c75383e3c4f7074696f6e3c5665633c75383e3e10e020456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e2020506172616d733a4c202d207374617475732074657874206861736838202d207374617475732074657874384275646765745370656e64696e670c244163636f756e7449641c42616c616e63653c4f7074696f6e3c5665633c75383e3e14cc20456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e742020506172616d733a5c202d205265636569766572204163636f756e742049642e44202d2042616c616e6365207370656e742e34202d20526174696f6e616c652e28526577617264506169641020576f726b65724964244163636f756e7449641c42616c616e6365445265776172645061796d656e7454797065187020456d697473206f6e20706179696e6720746865207265776172642e2020506172616d733a50202d204964206f662074686520776f726b65722e5c202d205265636569766572204163636f756e742049642e24202d20526577617264b8202d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640820576f726b657249643c4f7074696f6e3c42616c616e63653e109420456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e2020506172616d733a34202d20576f726b65722049442eec202d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e50576f726b657253746f72616765557064617465640820576f726b657249641c5665633c75383e10ac20456d697473206f6e207570646174696e672074686520776f726b65722073746f7261676520726f6c652e2020506172616d733a50202d204964206f662074686520776f726b65722e54202d205261772073746f72616765206669656c642e304c65616452656d61726b6564041c5665633c75383e0c9820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a28202d206d65737361676538576f726b657252656d61726b65640820576f726b657249641c5665633c75383e109820456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167652020506172616d733a24202d20776f726b657228202d206d65737361676518504d6178576f726b65724e756d6265724c696d69740c75333210640000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697438543a3a426c6f636b4e756d62657210c0a8000004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6528543a3a42616c616e636540d007000000000000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b6528543a3a42616c616e636540d0070000000000000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f640c753332109a38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b4964384c6f636b4964656e7469666965722077672d64697374720464205374616b696e672068616e646c6572206c6f636b2069642e70605374616b6542616c616e636543616e6e6f7442655a65726f049c2050726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740460204f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c65616465727304c02043616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f744578697374048c20576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d6265724578636565646564048c20576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f74457869737404b8205375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c656164657245786973747304c8205468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740450204e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f7453657404642043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374045c20576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e047420496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74048c205369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573048c205374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65049420496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e6704dc204170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e740464204f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e67049c20496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f04682052657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d62657204b0205374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e7404b4205374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f526577617264048020576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d040d012053706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f046420496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e6704a82049742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f766964656404c02043616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b650401012043616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e6704f420547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67048420576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e26041c40436865636b5370656356657273696f6e38436865636b547856657273696f6e30436865636b47656e6573697338436865636b4d6f7274616c69747928436865636b4e6f6e63652c436865636b576569676874604368617267655472616e73616374696f6e5061796d656e74","id":"1"} +{"jsonrpc":"2.0","result":"0x6d6574610e1d0a000c1c73705f636f72651863727970746f2c4163636f756e7449643332000004000401205b75383b2033325d0000040000032000000008000800000503000c08306672616d655f73797374656d2c4163636f756e74496e666f0814496e64657801102c4163636f756e74446174610114001401146e6f6e6365100114496e646578000124636f6e73756d657273100120526566436f756e7400012470726f766964657273100120526566436f756e7400012c73756666696369656e7473100120526566436f756e740001106461746114012c4163636f756e7444617461000010000005050014083c70616c6c65745f62616c616e6365732c4163636f756e7444617461041c42616c616e63650118001001106672656518011c42616c616e6365000120726573657276656418011c42616c616e636500012c6d6973635f66726f7a656e18011c42616c616e63650001286665655f66726f7a656e18011c42616c616e636500001800000507001c0c346672616d655f737570706f72741c77656967687473405065724469737061746368436c6173730404540120000c01186e6f726d616c2001045400012c6f7065726174696f6e616c200104540001246d616e6461746f727920010454000020000005060024083c7072696d69746976655f74797065731048323536000004000401585b75383b202f2ac2ab2a2f203332202f2ac2bb2a2f5d00002800000208002c102873705f72756e74696d651c67656e65726963186469676573741844696765737400000401106c6f677330013c5665633c4469676573744974656d3e000030000002340034102873705f72756e74696d651c67656e6572696318646967657374284469676573744974656d0001142850726552756e74696d650800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e00060024436f6e73656e7375730800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000400105365616c0800380144436f6e73656e737573456e67696e654964000028011c5665633c75383e000500144f74686572040028011c5665633c75383e0000006452756e74696d65456e7669726f6e6d656e745570646174656400080000380000030400000008003c00000240004008306672616d655f73797374656d2c4576656e745265636f7264080445014404540124000c01147068617365b503011450686173650001146576656e7444010445000118746f70696373b90301185665633c543e00004408586a6f7973747265616d5f6e6f64655f72756e74696d65144576656e7400018c1853797374656d04004801706672616d655f73797374656d3a3a4576656e743c52756e74696d653e0000001c5574696c69747904006c01607375627374726174655f7574696c6974793a3a4576656e740001002042616c616e636573040078017c70616c6c65745f62616c616e6365733a3a4576656e743c52756e74696d653e00050068456c656374696f6e50726f76696465724d756c7469506861736504008001d070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653a3a4576656e743c52756e74696d653e0007001c5374616b696e67040090017870616c6c65745f7374616b696e673a3a4576656e743c52756e74696d653e0008001c53657373696f6e0400a0015470616c6c65745f73657373696f6e3a3a4576656e740009001c4772616e6470610400a4015470616c6c65745f6772616e6470613a3a4576656e74000b0020496d4f6e6c696e650400b8018070616c6c65745f696d5f6f6e6c696e653a3a4576656e743c52756e74696d653e000d00204f6666656e6365730400dc015870616c6c65745f6f6666656e6365733a3a4576656e74000e00105375646f0400e4016c70616c6c65745f7375646f3a3a4576656e743c52756e74696d653e00100020426167734c6973740400ec018070616c6c65745f626167735f6c6973743a3a4576656e743c52756e74696d653e0011001c56657374696e670400f0017870616c6c65745f76657374696e673a3a4576656e743c52756e74696d653e001200204d756c74697369670400f4017c70616c6c65745f6d756c74697369673a3a4576656e743c52756e74696d653e0013001c436f756e63696c0400fc015c636f756e63696c3a3a4576656e743c52756e74696d653e001400285265666572656e64756d0400050101c47265666572656e64756d3a3a4576656e743c52756e74696d652c207265666572656e64756d3a3a496e7374616e6365313e0015001c4d656d626572730400150101686d656d626572736869703a3a4576656e743c52756e74696d653e00160014466f72756d040035010154666f72756d3a3a4576656e743c52756e74696d653e00170030436f6e737469747574696f6e04005101018c70616c6c65745f636f6e737469747574696f6e3a3a4576656e743c52756e74696d653e00180018426f756e7479040055010158626f756e74793a3a4576656e743c52756e74696d653e001900404a6f7973747265616d5574696c6974790400790101846a6f7973747265616d5f7574696c6974793a3a4576656e743c52756e74696d653e001a001c436f6e74656e7404008501015c636f6e74656e743a3a4576656e743c52756e74696d653e001b001c53746f7261676504007102015c73746f726167653a3a4576656e743c52756e74696d653e001c003050726f6a656374546f6b656e0400a502017470726f6a6563745f746f6b656e3a3a4576656e743c52756e74696d653e001d003c50726f706f73616c73456e67696e6504000d03018070726f706f73616c735f656e67696e653a3a4576656e743c52756e74696d653e001e004c50726f706f73616c7344697363757373696f6e04002503019070726f706f73616c735f64697363757373696f6e3a3a4576656e743c52756e74696d653e001f003850726f706f73616c73436f64657804002d03017c70726f706f73616c735f636f6465783a3a4576656e743c52756e74696d653e00200044466f72756d576f726b696e6747726f75700400510301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365313e0021004c53746f72616765576f726b696e6747726f75700400750301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365323e0022004c436f6e74656e74576f726b696e6747726f757004007d0301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365333e0023006c4f7065726174696f6e73576f726b696e6747726f7570416c7068610400850301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365343e0024003c417070576f726b696e6747726f757004008d0301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365353e002500584d656d62657273686970576f726b696e6747726f75700400950301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365363e002600684f7065726174696f6e73576f726b696e6747726f75704265746104009d0301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365373e0027006c4f7065726174696f6e73576f726b696e6747726f757047616d6d610400a50301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365383e00280060446973747269627574696f6e576f726b696e6747726f75700400ad0301dc776f726b696e675f67726f75703a3a4576656e743c52756e74696d652c20776f726b696e675f67726f75703a3a496e7374616e6365393e00290000480c306672616d655f73797374656d1870616c6c6574144576656e740404540001184045787472696e7369635375636365737304013464697370617463685f696e666f4c01304469737061746368496e666f00000490416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e3c45787472696e7369634661696c656408013864697370617463685f6572726f7258013444697370617463684572726f7200013464697370617463685f696e666f4c01304469737061746368496e666f00010450416e2065787472696e736963206661696c65642e2c436f64655570646174656400020450603a636f6465602077617320757064617465642e284e65774163636f756e7404011c6163636f756e74000130543a3a4163636f756e7449640003046841206e6577206163636f756e742077617320637265617465642e344b696c6c65644163636f756e7404011c6163636f756e74000130543a3a4163636f756e74496400040458416e206163636f756e7420776173207265617065642e2052656d61726b656408011873656e646572000130543a3a4163636f756e7449640001106861736824011c543a3a48617368000504704f6e206f6e2d636861696e2072656d61726b2068617070656e65642e04704576656e7420666f72207468652053797374656d2070616c6c65742e4c0c346672616d655f737570706f72741c77656967687473304469737061746368496e666f00000c0118776569676874200118576569676874000114636c6173735001344469737061746368436c617373000120706179735f666565540110506179730000500c346672616d655f737570706f72741c77656967687473344469737061746368436c61737300010c184e6f726d616c0000002c4f7065726174696f6e616c000100244d616e6461746f727900020000540c346672616d655f737570706f72741c7765696768747310506179730001080c596573000000084e6f0001000058082873705f72756e74696d653444697370617463684572726f72000128144f746865720000003043616e6e6f744c6f6f6b7570000100244261644f726967696e000200184d6f64756c6504005c012c4d6f64756c654572726f7200030044436f6e73756d657252656d61696e696e670004002c4e6f50726f76696465727300050040546f6f4d616e79436f6e73756d65727300060014546f6b656e0400600128546f6b656e4572726f720007002841726974686d65746963040064013c41726974686d657469634572726f72000800345472616e73616374696f6e616c04006801485472616e73616374696f6e616c4572726f72000900005c082873705f72756e74696d652c4d6f64756c654572726f720000080114696e64657808010875380001146572726f7238018c5b75383b204d41585f4d4f44554c455f4552524f525f454e434f4445445f53495a455d000060082873705f72756e74696d6528546f6b656e4572726f7200011c1c4e6f46756e647300000020576f756c644469650001003042656c6f774d696e696d756d0002003043616e6e6f7443726561746500030030556e6b6e6f776e41737365740004001846726f7a656e0005002c556e737570706f727465640006000064082873705f72756e74696d653c41726974686d657469634572726f7200010c24556e646572666c6f77000000204f766572666c6f77000100384469766973696f6e42795a65726f0002000068082873705f72756e74696d65485472616e73616374696f6e616c4572726f72000108304c696d6974526561636865640000001c4e6f4c61796572000100006c0c3870616c6c65745f7574696c6974791870616c6c6574144576656e74000118404261746368496e746572727570746564080114696e64657810010c7533320001146572726f7258013444697370617463684572726f7200000855014261746368206f66206469737061746368657320646964206e6f7420636f6d706c6574652066756c6c792e20496e646578206f66206669727374206661696c696e6720646973706174636820676976656e2c2061734877656c6c20617320746865206572726f722e384261746368436f6d706c65746564000104c84261746368206f66206469737061746368657320636f6d706c657465642066756c6c792077697468206e6f206572726f722e604261746368436f6d706c65746564576974684572726f7273000204b44261746368206f66206469737061746368657320636f6d706c657465642062757420686173206572726f72732e344974656d436f6d706c657465640003041d01412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206e6f206572726f722e284974656d4661696c65640401146572726f7258013444697370617463684572726f720004041101412073696e676c65206974656d2077697468696e2061204261746368206f6620646973706174636865732068617320636f6d706c657465642077697468206572726f722e30446973706174636865644173040118726573756c747001384469737061746368526573756c7400050458412063616c6c2077617320646973706174636865642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909700418526573756c740804540174044501580108084f6b040074000000000c4572720400580000010000740000040000780c3c70616c6c65745f62616c616e6365731870616c6c6574144576656e740804540004490001281c456e646f77656408011c6163636f756e74000130543a3a4163636f756e744964000130667265655f62616c616e6365180128543a3a42616c616e6365000004b8416e206163636f756e74207761732063726561746564207769746820736f6d6520667265652062616c616e63652e20447573744c6f737408011c6163636f756e74000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650001083d01416e206163636f756e74207761732072656d6f7665642077686f73652062616c616e636520776173206e6f6e2d7a65726f206275742062656c6f77204578697374656e7469616c4465706f7369742c78726573756c74696e6720696e20616e206f75747269676874206c6f73732e205472616e736665720c011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650002044c5472616e73666572207375636365656465642e2842616c616e63655365740c010c77686f000130543a3a4163636f756e74496400011066726565180128543a3a42616c616e63650001207265736572766564180128543a3a42616c616e636500030468412062616c616e6365207761732073657420627920726f6f742e20526573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000404e0536f6d652062616c616e63652077617320726573657276656420286d6f7665642066726f6d206672656520746f207265736572766564292e28556e726573657276656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000504e8536f6d652062616c616e63652077617320756e726573657276656420286d6f7665642066726f6d20726573657276656420746f2066726565292e4852657365727665526570617472696174656410011066726f6d000130543a3a4163636f756e744964000108746f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e636500014864657374696e6174696f6e5f7374617475737c01185374617475730006084d01536f6d652062616c616e636520776173206d6f7665642066726f6d207468652072657365727665206f6620746865206669727374206163636f756e7420746f20746865207365636f6e64206163636f756e742ed846696e616c20617267756d656e7420696e64696361746573207468652064657374696e6174696f6e2062616c616e636520747970652e1c4465706f73697408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e6365000704d8536f6d6520616d6f756e7420776173206465706f73697465642028652e672e20666f72207472616e73616374696f6e2066656573292e20576974686472617708010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650008041d01536f6d6520616d6f756e74207761732077697468647261776e2066726f6d20746865206163636f756e742028652e672e20666f72207472616e73616374696f6e2066656573292e1c536c617368656408010c77686f000130543a3a4163636f756e744964000118616d6f756e74180128543a3a42616c616e63650009040101536f6d6520616d6f756e74207761732072656d6f7665642066726f6d20746865206163636f756e742028652e672e20666f72206d69736265686176696f72292e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a0909097c14346672616d655f737570706f72741874726169747318746f6b656e73106d6973633442616c616e6365537461747573000108104672656500000020526573657276656400010000800c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144576656e7404045400011838536f6c7574696f6e53746f726564080140656c656374696f6e5f636f6d7075746584013c456c656374696f6e436f6d70757465000130707265765f656a6563746564880110626f6f6c000018b44120736f6c7574696f6e207761732073746f72656420776974682074686520676976656e20636f6d707574652e003d0149662074686520736f6c7574696f6e206973207369676e65642c2074686973206d65616e732074686174206974206861736e277420796574206265656e2070726f6365737365642e204966207468650501736f6c7574696f6e20697320756e7369676e65642c2074686973206d65616e7320746861742069742068617320616c736f206265656e2070726f6365737365642e0051015468652060626f6f6c6020697320607472756560207768656e20612070726576696f757320736f6c7574696f6e2077617320656a656374656420746f206d616b6520726f6f6d20666f722074686973206f6e652e44456c656374696f6e46696e616c697a6564040140656c656374696f6e5f636f6d707574658c015c4f7074696f6e3c456c656374696f6e436f6d707574653e000108550154686520656c656374696f6e20686173206265656e2066696e616c697a65642c20776974682060536f6d6560206f662074686520676976656e20636f6d7075746174696f6e2c206f7220656c73652069662074686560656c656374696f6e206661696c65642c20604e6f6e65602e20526577617264656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0002042501416e206163636f756e7420686173206265656e20726577617264656420666f72207468656972207369676e6564207375626d697373696f6e206265696e672066696e616c697a65642e1c536c617368656408011c6163636f756e740001983c54206173206672616d655f73797374656d3a3a436f6e6669673e3a3a4163636f756e74496400011476616c756518013042616c616e63654f663c543e0003042101416e206163636f756e7420686173206265656e20736c617368656420666f72207375626d697474696e6720616e20696e76616c6964207369676e6564207375626d697373696f6e2e485369676e6564506861736553746172746564040114726f756e6410010c753332000404c0546865207369676e6564207068617365206f662074686520676976656e20726f756e642068617320737461727465642e50556e7369676e6564506861736553746172746564040114726f756e6410010c753332000504c854686520756e7369676e6564207068617365206f662074686520676976656e20726f756e642068617320737461727465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090984089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173653c456c656374696f6e436f6d707574650001141c4f6e436861696e000000185369676e656400010020556e7369676e65640002002046616c6c6261636b00030024456d657267656e6379000400008800000500008c04184f7074696f6e04045401840108104e6f6e6500000010536f6d65040084000001000090103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144576656e740404540001341c457261506169640c00100120457261496e646578000018013042616c616e63654f663c543e000018013042616c616e63654f663c543e00000c550154686520657261207061796f757420686173206265656e207365743b207468652066697273742062616c616e6365206973207468652076616c696461746f722d7061796f75743b20746865207365636f6e64206973c07468652072656d61696e6465722066726f6d20746865206d6178696d756d20616d6f756e74206f66207265776172642ea85c5b6572615f696e6465782c2076616c696461746f725f7061796f75742c2072656d61696e6465725c5d2052657761726465640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0001040501546865206e6f6d696e61746f7220686173206265656e207265776172646564206279207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d1c536c61736865640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e00020821014f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e545c5b76616c696461746f722c20616d6f756e745c5d684f6c64536c617368696e675265706f7274446973636172646564040010013053657373696f6e496e6465780003081901416e206f6c6420736c617368696e67207265706f72742066726f6d2061207072696f72206572612077617320646973636172646564206265636175736520697420636f756c648c6e6f742062652070726f6365737365642e205c5b73657373696f6e5f696e6465785c5d385374616b657273456c65637465640004048441206e657720736574206f66207374616b6572732077617320656c65637465642e18426f6e6465640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000510d0416e206163636f756e742068617320626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d004d014e4f54453a2054686973206576656e74206973206f6e6c7920656d6974746564207768656e2066756e64732061726520626f6e64656420766961206120646973706174636861626c652e204e6f7461626c792c210169742077696c6c206e6f7420626520656d697474656420666f72207374616b696e672072657761726473207768656e20746865792061726520616464656420746f207374616b652e20556e626f6e6465640800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e000604d8416e206163636f756e742068617320756e626f6e646564207468697320616d6f756e742e205c5b73746173682c20616d6f756e745c5d2457697468647261776e0800000130543a3a4163636f756e744964000018013042616c616e63654f663c543e0007085901416e206163636f756e74206861732063616c6c6564206077697468647261775f756e626f6e6465646020616e642072656d6f76656420756e626f6e64696e67206368756e6b7320776f727468206042616c616e636560ac66726f6d2074686520756e6c6f636b696e672071756575652e205c5b73746173682c20616d6f756e745c5d184b69636b65640800000130543a3a4163636f756e7449640000000130543a3a4163636f756e744964000804090141206e6f6d696e61746f7220686173206265656e206b69636b65642066726f6d20612076616c696461746f722e205c5b6e6f6d696e61746f722c2073746173685c5d545374616b696e67456c656374696f6e4661696c6564000904ac54686520656c656374696f6e206661696c65642e204e6f206e65772065726120697320706c616e6e65642e1c4368696c6c65640400000130543a3a4163636f756e744964000a082101416e206163636f756e74206861732073746f707065642070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e245c5b73746173685c5d345061796f7574537461727465640800100120457261496e6465780000000130543a3a4163636f756e744964000b041501546865207374616b657273272072657761726473206172652067657474696e6720706169642e205c5b6572615f696e6465782c2076616c696461746f725f73746173685c5d4456616c696461746f7250726566735365740800000130543a3a4163636f756e744964000094013856616c696461746f725072656673000c0498412076616c696461746f72206861732073657420746865697220707265666572656e6365732e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a09090994083870616c6c65745f7374616b696e673856616c696461746f7250726566730000080128636f6d6d697373696f6e98011c50657262696c6c00011c626c6f636b6564880110626f6f6c0000980000069c009c0c3473705f61726974686d65746963287065725f7468696e67731c50657262696c6c0000040010010c7533320000a00c3870616c6c65745f73657373696f6e1870616c6c6574144576656e74000104284e657753657373696f6e04013473657373696f6e5f696e64657810013053657373696f6e496e64657800000839014e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f74207468659c626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909a40c3870616c6c65745f6772616e6470611870616c6c6574144576656e7400010c384e6577417574686f726974696573040134617574686f726974795f736574a80134417574686f726974794c6973740000048c4e657720617574686f726974792073657420686173206265656e206170706c6965642e185061757365640001049843757272656e7420617574686f726974792073657420686173206265656e207061757365642e1c526573756d65640002049c43757272656e7420617574686f726974792073657420686173206265656e20726573756d65642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909a8000002ac00ac00000408b02000b00c4c73705f66696e616c6974795f6772616e6470610c617070185075626c696300000400b4013c656432353531393a3a5075626c69630000b40c1c73705f636f72651c65643235353139185075626c6963000004000401205b75383b2033325d0000b80c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144576656e7404045400010c444865617274626561745265636569766564040130617574686f726974795f6964bc0138543a3a417574686f726974794964000004c041206e657720686561727462656174207761732072656365697665642066726f6d2060417574686f726974794964602e1c416c6c476f6f64000104d041742074686520656e64206f66207468652073657373696f6e2c206e6f206f6666656e63652077617320636f6d6d69747465642e2c536f6d654f66666c696e6504011c6f66666c696e65c4016c5665633c4964656e74696669636174696f6e5475706c653c543e3e000204290141742074686520656e64206f66207468652073657373696f6e2c206174206c65617374206f6e652076616c696461746f722077617320666f756e6420746f206265206f66666c696e652e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909bc104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139185075626c696300000400c0013c737232353531393a3a5075626c69630000c00c1c73705f636f72651c73723235353139185075626c6963000004000401205b75383b2033325d0000c4000002c800c80000040800cc00cc083870616c6c65745f7374616b696e67204578706f7375726508244163636f756e74496401001c42616c616e63650118000c0114746f74616cd0011c42616c616e636500010c6f776ed0011c42616c616e63650001186f7468657273d401ac5665633c496e646976696475616c4578706f737572653c4163636f756e7449642c2042616c616e63653e3e0000d00000061800d4000002d800d8083870616c6c65745f7374616b696e6748496e646976696475616c4578706f7375726508244163636f756e74496401001c42616c616e636501180008010c77686f0001244163636f756e74496400011476616c7565d0011c42616c616e63650000dc0c3c70616c6c65745f6f6666656e6365731870616c6c6574144576656e740001041c4f6666656e63650801106b696e64e001104b696e6400012074696d65736c6f742801384f706171756554696d65536c6f7400000c5101546865726520697320616e206f6666656e6365207265706f72746564206f662074686520676976656e20606b696e64602068617070656e656420617420746865206073657373696f6e5f696e6465786020616e643501286b696e642d7370656369666963292074696d6520736c6f742e2054686973206576656e74206973206e6f74206465706f736974656420666f72206475706c696361746520736c61736865732e4c5c5b6b696e642c2074696d65736c6f745c5d2e04304576656e747320747970652ee0000003100000000800e40c2c70616c6c65745f7375646f1870616c6c6574144576656e7404045400010c14537564696404012c7375646f5f726573756c747001384469737061746368526573756c740000048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d284b65794368616e6765640401286f6c645f7375646f6572e801504f7074696f6e3c543a3a4163636f756e7449643e0001043901546865205c5b7375646f65725c5d206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c696564206966206f6e6520657869737465642e285375646f4173446f6e6504012c7375646f5f726573756c747001384469737061746368526573756c740002048841207375646f206a75737420746f6f6b20706c6163652e205c5b726573756c745c5d0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909e804184f7074696f6e04045401000108104e6f6e6500000010536f6d650400000000010000ec0c4070616c6c65745f626167735f6c6973741870616c6c6574144576656e740804540004490001082052656261676765640c010c77686f000130543a3a4163636f756e74496400011066726f6d200120543a3a53636f7265000108746f200120543a3a53636f7265000004a44d6f76656420616e206163636f756e742066726f6d206f6e652062616720746f20616e6f746865722e3053636f72655570646174656408010c77686f000130543a3a4163636f756e7449640001246e65775f73636f7265200120543a3a53636f7265000104d855706461746564207468652073636f7265206f6620736f6d65206163636f756e7420746f2074686520676976656e20616d6f756e742e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f00c3870616c6c65745f76657374696e671870616c6c6574144576656e740404540001083856657374696e675570646174656408011c6163636f756e74000130543a3a4163636f756e744964000120756e76657374656418013042616c616e63654f663c543e000008510154686520616d6f756e742076657374656420686173206265656e20757064617465642e205468697320636f756c6420696e6469636174652061206368616e676520696e2066756e647320617661696c61626c652e25015468652062616c616e636520676976656e2069732074686520616d6f756e74207768696368206973206c65667420756e7665737465642028616e642074687573206c6f636b6564292e4056657374696e67436f6d706c6574656404011c6163636f756e74000130543a3a4163636f756e7449640001049c416e205c5b6163636f756e745c5d20686173206265636f6d652066756c6c79207665737465642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f40c3c70616c6c65745f6d756c74697369671870616c6c6574144576656e740404540001102c4e65774d756c74697369670c0124617070726f76696e67000130543a3a4163636f756e7449640001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c486173680000048c41206e6577206d756c7469736967206f7065726174696f6e2068617320626567756e2e404d756c7469736967417070726f76616c100124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e74f8016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000104c841206d756c7469736967206f7065726174696f6e20686173206265656e20617070726f76656420627920736f6d656f6e652e404d756c74697369674578656375746564140124617070726f76696e67000130543a3a4163636f756e74496400012474696d65706f696e74f8016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000118726573756c747001384469737061746368526573756c740002049c41206d756c7469736967206f7065726174696f6e20686173206265656e2065786563757465642e444d756c746973696743616e63656c6c656410012863616e63656c6c696e67000130543a3a4163636f756e74496400012474696d65706f696e74f8016454696d65706f696e743c543a3a426c6f636b4e756d6265723e0001206d756c7469736967000130543a3a4163636f756e74496400012463616c6c5f6861736804012043616c6c48617368000304a041206d756c7469736967206f7065726174696f6e20686173206265656e2063616e63656c6c65642e0499010a090909546865205b6576656e745d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f72732920656d69747465640a090909627920746869732070616c6c65742e0a090909f8083c70616c6c65745f6d756c74697369672454696d65706f696e74042c426c6f636b4e756d62657201100008011868656967687410012c426c6f636b4e756d626572000114696e64657810010c7533320000fc083870616c6c65745f636f756e63696c205261774576656e74101c42616c616e636501182c426c6f636b4e756d6265720110204d656d62657249640120244163636f756e7449640100014c5c416e6e6f756e63696e67506572696f6453746172746564040010012c426c6f636b4e756d6265720000045c4e657720636f756e63696c2077617320656c65637465644c4e6f74456e6f75676843616e64696461746573040010012c426c6f636b4e756d6265720001041d01416e6e6f756e63696e6720706572696f642063616e27742066696e6973682062656361757365206f6620696e73756666696369656e742063616e6469647461746520636f756e744c566f74696e67506572696f6453746172746564040010010c753332000204a843616e646964617465732061726520616e6e6f756e63656420616e6420766f74696e6720737461727473304e657743616e64696461746510002001204d656d626572496400000001244163636f756e74496400000001244163636f756e744964000018011c42616c616e63650003045c4e65772063616e64696461746520616e6e6f756e636564444e6577436f756e63696c456c65637465640800010101345665633c4d656d62657249643e000010012c426c6f636b4e756d626572000404944e657720636f756e63696c2077617320656c656374656420616e64206170706f696e746564504e6577436f756e63696c4e6f74456c6563746564040010012c426c6f636b4e756d6265720005046c4e657720636f756e63696c20776173206e6f7420656c65637465645443616e6469646163795374616b6552656c6561736504002001204d656d6265724964000604d843616e646964616379207374616b65207468617420776173206e6f206c6f6e676572206e6565646564207761732072656c65617365644443616e646964616379576974686472617704002001204d656d62657249640007049443616e646964617465206861732077697468647261776e206869732063616e6469646163794043616e6469646163794e6f746553657408002001204d656d6265724964000028011c5665633c75383e000804d05468652063616e64696461746520686173207365742061206e6577206e6f746520666f722074686569722063616e646964616379345265776172645061796d656e7410002001204d656d626572496400000001244163636f756e744964000018011c42616c616e6365000018011c42616c616e6365000904c05468652077686f6c652072657761726420776173207061696420746f2074686520636f756e63696c206d656d6265722e4042756467657442616c616e6365536574040018011c42616c616e6365000a049c4275646765742062616c616e636520776173206368616e6765642062792074686520726f6f742e30427564676574526566696c6c040018011c42616c616e6365000b04c44275646765742062616c616e63652077617320696e63726561736564206279206175746f6d6174696320726566696c6c2e4c427564676574526566696c6c506c616e6e6564040010012c426c6f636b4e756d626572000c048c546865206e6578742062756467657420726566696c6c2077617320706c616e6e65642e58427564676574496e6372656d656e7455706461746564040018011c42616c616e6365000d048842756467657420696e6372656d656e7420686173206265656e20757064617465642e58436f756e63696c6f7252657761726455706461746564040018011c42616c616e6365000e0488436f756e63696c6f722072657761726420686173206265656e20757064617465642e345265717565737446756e64656408000001244163636f756e744964000018011c42616c616e6365000f045c5265717565737420686173206265656e2066756e6465644c436f756e63696c42756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0010146046756e642074686520636f756e63696c206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c6544436f756e63696c6f7252656d61726b656408002001204d656d6265724964000028011c5665633c75383e00110460436f756e63696c6f722072656d61726b206d6573736167654443616e64696461746552656d61726b656408002001204d656d6265724964000028011c5665633c75383e0012046043616e6469646174652072656d61726b206d657373616765085c4576656e747320666f722074686973206d6f64756c652e00010100000220000501084470616c6c65745f7265666572656e64756d205261774576656e741c2c426c6f636b4e756d62657201101c42616c616e6365011810486173680124244163636f756e744964010024566f7465506f7765720118204d656d626572496401200449010901011c445265666572656e64756d53746172746564080010010c753332000010012c426c6f636b4e756d626572000004485265666572656e64756d20737461727465646c5265666572656e64756d53746172746564466f72636566756c6c79080010010c753332000010012c426c6f636b4e756d626572000104485265666572656e64756d20737461727465645452657665616c696e67537461676553746172746564040010012c426c6f636b4e756d6265720002046452657665616c696e672070686173652068617320626567756e485265666572656e64756d46696e697368656404000d0101985665633c4f7074696f6e526573756c743c4d656d62657249642c20566f7465506f7765723e3e000304c05265666572656e64756d20656e64656420616e642077696e6e696e67206f7074696f6e207761732073656c656374656420566f7465436173740c000001244163636f756e744964000024011048617368000018011c42616c616e636500040478557365722063617374206120766f746520696e207265666572656e64756d30566f746552657665616c65640c000001244163636f756e74496400002001204d656d6265724964000028011c5665633c75383e00050458557365722072657665616c65642068697320766f7465345374616b6552656c656173656404000001244163636f756e7449640006045c557365722072656c656173656420686973207374616b65085c4576656e747320666f722074686973206d6f64756c652e000901084470616c6c65745f7265666572656e64756d24496e7374616e636531000000000d010000021101001101084470616c6c65745f7265666572656e64756d304f7074696f6e526573756c7408204d656d6265724964012024566f7465506f7765720118000801246f7074696f6e5f69642001204d656d6265724964000128766f74655f706f776572180124566f7465506f77657200001501084470616c6c65745f6d656d62657273686970205261774576656e7420204d656d626572496401201c42616c616e63650118244163636f756e74496401005c4275794d656d62657273686970506172616d65746572730119011c4163746f724964012068496e766974654d656d62657273686970506172616d6574657273012501584372656174654d656d626572506172616d657465727301290160476966744d656d62657273686970506172616d6574657273012d010144344d656d626572496e766974656408002001204d656d6265724964000025010168496e766974654d656d62657273686970506172616d6574657273000000404d656d6265727368697047696674656408002001204d656d626572496400002d010160476966744d656d62657273686970506172616d6574657273000100404d656d62657273686970426f756768740c002001204d656d626572496400001901015c4275794d656d62657273686970506172616d6574657273000010010c753332000200504d656d62657250726f66696c65557064617465640c002001204d656d626572496400001d01013c4f7074696f6e3c5665633c75383e3e00001d01013c4f7074696f6e3c5665633c75383e3e000300544d656d6265724163636f756e7473557064617465640c002001204d656d62657249640000e801444f7074696f6e3c4163636f756e7449643e0000e801444f7074696f6e3c4163636f756e7449643e0004007c4d656d626572566572696669636174696f6e537461747573557064617465640c002001204d656d62657249640000880110626f6f6c000020011c4163746f72496400050048526566657272616c437574557064617465640400080108753800060048496e76697465735472616e736665727265640c002001204d656d626572496400002001204d656d6265724964000010010c753332000700584d656d62657273686970507269636555706461746564040018011c42616c616e63650008007c496e697469616c496e7669746174696f6e42616c616e636555706461746564040018011c42616c616e6365000900704c6561646572496e7669746174696f6e51756f746155706461746564040010010c753332000a0074496e697469616c496e7669746174696f6e436f756e7455706461746564040010010c753332000b004c5374616b696e674163636f756e74416464656408000001244163636f756e74496400002001204d656d6265724964000c00545374616b696e674163636f756e7452656d6f76656408000001244163636f756e74496400002001204d656d6265724964000d005c5374616b696e674163636f756e74436f6e6669726d656408000001244163636f756e74496400002001204d656d6265724964000e00384d656d62657252656d61726b656408002001204d656d6265724964000028011c5665633c75383e000f00344d656d626572437265617465640c002001204d656d62657249640000290101584372656174654d656d626572506172616d6574657273000010010c753332001000085c4576656e747320666f722074686973206d6f64756c652e001901084470616c6c65745f6d656d626572736869705c4275794d656d62657273686970506172616d657465727308244163636f756e7449640100204d656d6265724964012000140130726f6f745f6163636f756e740001244163636f756e744964000148636f6e74726f6c6c65725f6163636f756e740001244163636f756e74496400011868616e646c651d01013c4f7074696f6e3c5665633c75383e3e0001206d6574616461746128011c5665633c75383e00012c72656665727265725f6964210101404f7074696f6e3c4d656d62657249643e00001d0104184f7074696f6e04045401280108104e6f6e6500000010536f6d650400280000010000210104184f7074696f6e04045401200108104e6f6e6500000010536f6d6504002000000100002501084470616c6c65745f6d656d6265727368697068496e766974654d656d62657273686970506172616d657465727308244163636f756e7449640100204d656d6265724964012000140148696e766974696e675f6d656d6265725f69642001204d656d6265724964000130726f6f745f6163636f756e740001244163636f756e744964000148636f6e74726f6c6c65725f6163636f756e740001244163636f756e74496400011868616e646c651d01013c4f7074696f6e3c5665633c75383e3e0001206d6574616461746128011c5665633c75383e00002901084470616c6c65745f6d656d62657273686970584372656174654d656d626572506172616d657465727304244163636f756e744964010000140130726f6f745f6163636f756e740001244163636f756e744964000148636f6e74726f6c6c65725f6163636f756e740001244163636f756e74496400011868616e646c6528011c5665633c75383e0001206d6574616461746128011c5665633c75383e00014869735f666f756e64696e675f6d656d626572880110626f6f6c00002d01084470616c6c65745f6d656d6265727368697060476966744d656d62657273686970506172616d657465727308244163636f756e74496401001c42616c616e6365011800200130726f6f745f6163636f756e740001244163636f756e744964000148636f6e74726f6c6c65725f6163636f756e740001244163636f756e74496400011868616e646c651d01013c4f7074696f6e3c5665633c75383e3e0001206d6574616461746128011c5665633c75383e0001646372656469745f636f6e74726f6c6c65725f6163636f756e7418011c42616c616e63650001a06170706c795f636f6e74726f6c6c65725f6163636f756e745f696e7669746174696f6e5f6c6f636b3101013c4f7074696f6e3c42616c616e63653e00014c6372656469745f726f6f745f6163636f756e7418011c42616c616e63650001886170706c795f726f6f745f6163636f756e745f696e7669746174696f6e5f6c6f636b3101013c4f7074696f6e3c42616c616e63653e0000310104184f7074696f6e04045401180108104e6f6e6500000010536f6d6504001800000100003501083070616c6c65745f666f72756d205261774576656e74202843617465676f7279496401202c4d6f64657261746f7249640120205468726561644964012018506f737449640120104861736801242c466f72756d55736572496401203c50726976696c656765644163746f7201390138457874656e646564506f73744964013d0101443c43617465676f727943726561746564100020012843617465676f727949640000210101484f7074696f6e3c43617465676f727949643e000028011c5665633c75383e000028011c5665633c75383e00000464412063617465676f72792077617320696e74726f64756365647443617465676f7279417263686976616c537461747573557064617465640c0020012843617465676f727949640000880110626f6f6c00003901013c50726976696c656765644163746f72000108e0416e206172686963616c20737461747573206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e1501546865207365636f6e6420617267756d656e74207265666c6563747320746865206e657720617263686976616c20737461747573206f66207468652063617465676f72792e5043617465676f72795469746c65557064617465640c0020012843617465676f7279496400002401104861736800003901013c50726976696c656765644163746f72000208b841207469746c65206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e0101546865207365636f6e6420617267756d656e74207265666c6563747320746865206e6577207469746c652068617368206f66207468652063617465676f72792e6843617465676f72794465736372697074696f6e557064617465640c0020012843617465676f7279496400002401104861736800003901013c50726976696c656765644163746f72000308d041206469736372697074696f6e206f662063617465676f7279207769746820676976656e2069642077617320757064617465642e1901546865207365636f6e6420617267756d656e74207265666c6563747320746865206e6577206465736372697074696f6e2068617368206f66207468652063617465676f72792e3c43617465676f727944656c65746564080020012843617465676f7279496400003901013c50726976696c656765644163746f7200040458412063617465676f7279207761732064656c657465643454687265616443726561746564180020012843617465676f72794964000020012054687265616449640000200118506f73744964000020012c466f72756d557365724964000028011c5665633c75383e000028011c5665633c75383e0005088c4120746872656164207769746820676976656e2069642077617320637265617465642ef04120746869726420617267756d656e74207265666c656374732074686520696e697469616c20706f7374206964206f6620746865207468726561642e3c5468726561644d6f6465726174656410002001205468726561644964000028011c5665633c75383e00003901013c50726976696c656765644163746f72000020012843617465676f72794964000604944120746872656164207769746820676976656e20696420776173206d6f646572617465642e3454687265616455706461746564100020012054687265616449640000880110626f6f6c00003901013c50726976696c656765644163746f72000020012843617465676f727949640007088c4120746872656164207769746820676976656e2069642077617320757064617465642e0d01546865207365636f6e6420617267756d656e74207265666c6563747320746865206e657720617263686976616c20737461747573206f6620746865207468726561642e545468726561644d657461646174615570646174656410002001205468726561644964000020012c466f72756d557365724964000020012843617465676f72794964000028011c5665633c75383e0008049c4120746872656164206d6574616461746120676976656e2069642077617320757064617465642e3454687265616444656c6574656410002001205468726561644964000020012c466f72756d557365724964000020012843617465676f727949640000880110626f6f6c000904544120746872656164207761732064656c657465642e2c5468726561644d6f76656410002001205468726561644964000020012843617465676f7279496400003901013c50726976696c656765644163746f72000020012843617465676f72794964000a0488412074687265616420776173206d6f76656420746f206e65772063617465676f727924506f737441646465641800200118506f73744964000020012c466f72756d557365724964000020012843617465676f7279496400002001205468726561644964000028011c5665633c75383e0000880110626f6f6c000b047c506f7374207769746820676976656e2069642077617320637265617465642e34506f73744d6f646572617465641400200118506f73744964000028011c5665633c75383e00003901013c50726976696c656765644163746f72000020012843617465676f7279496400002001205468726561644964000c0484506f73742077697468206769766e6520696420776173206d6f646572617465642e2c506f737444656c657465640c0028011c5665633c75383e000020012c466f72756d55736572496400004101017842547265654d61703c457874656e646564506f737449642c20626f6f6c3e000d047c506f73742077697468206769766e65206964207761732064656c657465642e3c506f737454657874557064617465641400200118506f73744964000020012c466f72756d557365724964000020012843617465676f7279496400002001205468726561644964000028011c5665633c75383e000e08a0506f7374207769746820676976656e2069642068616420697473207465787420757064617465642e4d01546865207365636f6e6420617267756d656e74207265666c6563747320746865206e756d626572206f6620746f74616c206564697473207768656e20746865207465787420757064617465206f63637572732e6843617465676f7279537469636b795468726561645570646174650c0020012843617465676f7279496400004d01014842547265655365743c54687265616449643e00003901013c50726976696c656765644163746f72000f0488537469636b7920746872656164207570646174656420666f722063617465676f72799043617465676f72794d656d626572736869704f664d6f64657261746f72557064617465640c0020012c4d6f64657261746f724964000020012843617465676f727949640000880110626f6f6c0010042501416e206d6f64657261746f72206162696c69747920746f206d6f64657261746520612063617465676f727920616e64206974732073756263617465676f726965732075706461746564085c4576656e747320666f722074686973206d6f64756c652e003901083070616c6c65745f666f72756d3c50726976696c656765644163746f72040454000108104c656164000000244d6f64657261746f7204002001384d6f64657261746f7249643c543e000100003d01083070616c6c65745f666f72756d50457874656e646564506f737449644f626a6563740c2843617465676f727949640120205468726561644964012018506f737449640120000c012c63617465676f72795f696420012843617465676f727949640001247468726561645f6964200120546872656164496400011c706f73745f6964200118506f7374496400004101042042547265654d617008044b013d0104560188000400450100000045010000024901004901000004083d0188004d0104204254726565536574040454012000040001010000005101084c70616c6c65745f636f6e737469747574696f6e205261774576656e740410486173680124010444436f6e73747574696f6e416d656e646564080024011048617368000028011c5665633c75383e00001080456d697473206f6e20636f6e737469747574696f6e20616d656e646d656e742e2c506172616d65746572733a602d20636f6e737469747574696f6e207465787420686173684c2d20636f6e737469747574696f6e2074657874085c4576656e747320666f722074686973206d6f64756c652e005501083470616c6c65745f626f756e7479205261774576656e741c20426f756e7479496401201c456e747279496401201c42616c616e63650118204d656d62657249640120244163636f756e744964010060426f756e74794372656174696f6e506172616d6574657273015901384f7261636c654a7564676d656e74016901015c34426f756e7479437265617465640c00200120426f756e74794964000059010160426f756e74794372656174696f6e506172616d6574657273000028011c5665633c75383e000014544120626f756e74792077617320637265617465642e1c506172616d733a2c2d20626f756e7479204944542d206372656174696f6e20706172616d6574657273442d20626f756e7479206d6574616461746150426f756e74794f7261636c6553776974636865641000200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e00005d010154426f756e74794163746f723c4d656d62657249643e00005d010154426f756e74794163746f723c4d656d62657249643e000118d0426f756e7479204f7261636c652053776974636865642062792063757272656e74206f7261636c65206f7220636f756e63696c2e1c506172616d733a2c2d20626f756e7479204944282d207377697463686572442d2063757272656e745f6f7261636c652c302d206e6577206f7261636c6540426f756e74795465726d696e617465641000200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e00005d010154426f756e74794163746f723c4d656d62657249643e00005d010154426f756e74794163746f723c4d656d62657249643e0002188c4120626f756e747920776173207465726d696e6174656420627920636f756e63696c2e1c506172616d733a2c2d20626f756e74792049444c2d20626f756e7479207465726d696e61746f72402d20626f756e74792063726561746f723c2d20626f756e7479206f7261636c6530426f756e747946756e6465640c00200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000018011c42616c616e6365000314b44120626f756e7479207761732066756e6465642062792061206d656d626572206f72206120636f756e63696c2e1c506172616d733a2c2d20626f756e74792049443c2d20626f756e74792066756e646572402d2066756e64696e6720616d6f756e745c426f756e74794d617846756e64696e67526561636865640400200120426f756e7479496400040cbc4120626f756e747920686173207265616368656420697473207461726765742066756e64696e6720616d6f756e742e1c506172616d733a2c2d20626f756e74792049445c426f756e747946756e64696e675769746864726177616c0800200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000510c041206d656d626572206f72206120636f756e63696c206861732077697468647261776e207468652066756e64696e672e1c506172616d733a2c2d20626f756e74792049443c2d20626f756e74792066756e64657274426f756e747943726561746f724368657272795769746864726177616c0800200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000610f84120626f756e74792063726561746f72206861732077697468647261776e207468652063686572727920286d656d626572206f7220636f756e63696c292e1c506172616d733a2c2d20626f756e7479204944402d20626f756e74792063726561746f728c426f756e747943726561746f724f7261636c655265776172645769746864726177616c0800200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e00071015014120626f756e74792063726561746f72206861732077697468647261776e20746865206f7261636c652072657761726420286d656d626572206f7220636f756e63696c292e1c506172616d733a2c2d20626f756e7479204944402d20626f756e74792063726561746f7270426f756e74794f7261636c655265776172645769746864726177616c0c00200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000018011c42616c616e6365000814f441204f7261636c65206861732077697468647261776e20746865206f7261636c652072657761726420286d656d626572206f7220636f756e63696c292e1c506172616d733a2c2d20626f756e7479204944402d20626f756e74792063726561746f723c2d204f7261636c652052657761726434426f756e747952656d6f7665640400200120426f756e7479496400090c544120626f756e7479207761732072656d6f7665642e1c506172616d733a2c2d20626f756e747920494448576f726b456e747279416e6e6f756e6365641400200120426f756e74794964000020011c456e747279496400002001204d656d626572496400000001244163636f756e744964000028011c5665633c75383e000a1c64576f726b20656e7472792077617320616e6e6f756e6365642e1c506172616d733a2c2d20626f756e7479204944482d206372656174656420656e7472792049444c2d20656e7472616e74206d656d626572204944502d207374616b696e67206163636f756e74204944482d20776f726b206465736372697074696f6e34576f726b5375626d69747465641000200120426f756e74794964000020011c456e747279496400002001204d656d6265724964000028011c5665633c75383e000b18305375626d697420776f726b2e1c506172616d733a2c2d20626f756e7479204944482d206372656174656420656e7472792049444c2d20656e7472616e74206d656d626572204944a82d20776f726b206461746120286465736372697074696f6e2c2055524c2c20424c4f422c206574632e295c4f7261636c654a7564676d656e745375626d69747465641000200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e0000690101384f7261636c654a7564676d656e74000028011c5665633c75383e000c185c5375626d6974206f7261636c65206a7564676d656e742e1c506172616d733a2c2d20626f756e7479204944202d206f7261636c653c2d206a7564676d656e7420646174612c2d20726174696f6e616c6564576f726b456e7472616e7446756e647357697468647261776e0c00200120426f756e74794964000020011c456e747279496400002001204d656d6265724964000d145c576f726b20656e7472792077617320736c61736865642e1c506172616d733a2c2d20626f756e7479204944282d20656e7472792049444c2d20656e7472616e74206d656d62657220494464426f756e7479436f6e7472696275746f7252656d61726b65640c005d010154426f756e74794163746f723c4d656d62657249643e0000200120426f756e74794964000028011c5665633c75383e000e14a0426f756e747920636f6e7472696275746f72206d6164652061206d6573736167652072656d61726b1c506172616d733a342d20636f6e7472696275746f722c2d20626f756e7479206964242d206d65737361676550426f756e74794f7261636c6552656d61726b65640c005d010154426f756e74794163746f723c4d656d62657249643e0000200120426f756e74794964000028011c5665633c75383e000f148c426f756e7479206f7261636c65206d6164652061206d6573736167652072656d61726b1c506172616d733a202d206f7261636c652c2d20626f756e7479206964242d206d65737361676554426f756e7479456e7472616e7452656d61726b656410002001204d656d62657249640000200120426f756e74794964000020011c456e7472794964000028011c5665633c75383e00101890426f756e747920656e7472616e74206d6164652061206d6573736167652072656d61726b1c506172616d733a302d20656e7472616e745f69642c2d20626f756e7479206964282d20656e747279206964242d206d65737361676554426f756e747943726561746f7252656d61726b65640c005d010154426f756e74794163746f723c4d656d62657249643e0000200120426f756e74794964000028011c5665633c75383e00111490426f756e74792063726561746f72206d6164652061206d6573736167652072656d61726b1c506172616d733a242d2063726561746f722c2d20626f756e7479206964242d206d65737361676564576f726b5375626d697373696f6e506572696f64456e6465640800200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e0012105c576f726b20656e7472792077617320736c61736865642e1c506172616d733a2c2d20626f756e7479204944442d206f7261636c65202863616c6c65722960576f726b456e7472616e745374616b65556e6c6f636b65640c00200120426f756e74794964000020011c456e747279496400000001244163636f756e74496400131468576f726b20656e747279207374616b6520756e6c6f636b65642e1c506172616d733a2c2d20626f756e7479204944282d20656e7472792049443c2d207374616b65206163636f756e745c576f726b456e7472616e745374616b65536c61736865641000200120426f756e74794964000020011c456e747279496400000001244163636f756e744964000018011c42616c616e636500141864576f726b20656e747279207374616b6520736c61736865642e1c506172616d733a2c2d20626f756e7479204944282d20656e7472792049443c2d207374616b65206163636f756e74402d20736c617368656420616d6f756e747446756e6465725374617465426c6f6174426f6e6457697468647261776e0c00200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000018011c42616c616e63650015141d0141206d656d626572206f72206120636f756e63696c2066756e646572206861732077697468647261776e207468652066756e64657220737461746520626c6f617420626f6e642e1c506172616d733a2c2d20626f756e74792049443c2d20626f756e74792066756e646572802d2066756e64657220537461746520626c6f617420626f6e6420616d6f756e747843726561746f725374617465426c6f6174426f6e6457697468647261776e0c00200120426f756e7479496400005d010154426f756e74794163746f723c4d656d62657249643e000018011c42616c616e6365001614250141206d656d626572206f72206120636f756e63696c2063726561746f72206861732077697468647261776e207468652063726561746f7220737461746520626c6f617420626f6e642e1c506172616d733a2c2d20626f756e7479204944402d20626f756e74792063726561746f72842d2043726561746f7220537461746520626c6f617420626f6e6420616d6f756e74085c4576656e747320666f722074686973206d6f64756c652e005901083470616c6c65745f626f756e747940426f756e7479506172616d6574657273101c42616c616e636501182c426c6f636b4e756d6265720110204d656d626572496401205c436c6f736564436f6e747261637457686974656c697374014d01001c01186f7261636c655d010154426f756e74794163746f723c4d656d62657249643e000134636f6e74726163745f74797065610101b84173737572616e6365436f6e7472616374547970653c436c6f736564436f6e747261637457686974656c6973743e00011c63726561746f725d010154426f756e74794163746f723c4d656d62657249643e00011863686572727918011c42616c616e63650001346f7261636c655f72657761726418011c42616c616e6365000134656e7472616e745f7374616b6518011c42616c616e636500013066756e64696e675f747970656501018446756e64696e67547970653c426c6f636b4e756d6265722c2042616c616e63653e00005d01083470616c6c65745f626f756e74792c426f756e74794163746f7204204d656d6265724964012001081c436f756e63696c000000184d656d62657204002001204d656d6265724964000100006101083470616c6c65745f626f756e7479544173737572616e6365436f6e747261637454797065045c436c6f736564436f6e747261637457686974656c697374014d010108104f70656e00000018436c6f73656404004d01015c436c6f736564436f6e747261637457686974656c697374000100006501083470616c6c65745f626f756e74792c46756e64696e6754797065082c426c6f636b4e756d62657201101c42616c616e6365011801082450657270657475616c04011874617267657418011c42616c616e63650000001c4c696d6974656408011874617267657418011c42616c616e636500013866756e64696e675f706572696f6410012c426c6f636b4e756d626572000100006901042042547265654d617008044b01200456016d0100040071010000006d01083470616c6c65745f626f756e74795c4f7261636c65576f726b456e7472794a7564676d656e74041c42616c616e6365011801081857696e6e657204011872657761726418011c42616c616e63650000002052656a6563746564080138736c617368696e675f73686172659c011c50657262696c6c000150616374696f6e5f6a757374696669636174696f6e28011c5665633c75383e000100007101000002750100750100000408206d01007901083870616c6c65745f7574696c697479205261774576656e74081c42616c616e63650118244163636f756e74496401000110205369676e616c6564040028011c5665633c75383e00000c7841207369676e616c2070726f706f73616c207761732065786563757465641c506172616d733adc2d205369676e616c20676976656e207768656e206372656174696e672074686520636f72726573706f6e64696e672070726f706f73616c3c52756e74696d655570677261646564040028011c5665633c75383e00010c78412072756e74696d652075706772616465207761732065786563757465641c506172616d733a6c2d204e657720636f646520656e636f64656420696e2062797465736455706461746564576f726b696e6747726f75704275646765740c007d010130576f726b696e6747726f7570000018011c42616c616e636500008101012c42616c616e63654b696e64000218d8416e206055706461746520576f726b696e672047726f757020427564676574602070726f706f73616c207761732065786563757465641c506172616d733ab42d20576f726b696e672067726f757020776869636820627564676574206973206265696e6720757064617465647c2d20416d6f756e74206f662062616c616e6365206265696e67206d6f7665645d012d20456e756d2076617269616e74207769746820706f73697469766520696e6469636174696e672066756e6473206d6f76656420746f72776172647320776f726b696e672067726f757020616e64206e65676174697665c0616e64206e656761746976652066756e6473206d6f76696e672066726f6d2074686520776f726b696e672067726f757030546f6b656e734275726e656408000001244163636f756e744964000018011c42616c616e636500031060416e206163636f756e74206275726e656420746f6b656e731c506172616d733a882d204163636f756e74204964206f6620746865206275726e696e6720746f6b656e73882d2042616c616e6365206275726e65642066726f6d2074686174206163636f756e74085c4576656e747320666f722074686973206d6f64756c652e007d01103470616c6c65745f636f6d6d6f6e34776f726b696e675f67726f7570386974657261626c655f656e756d7330576f726b696e6747726f757000012414466f72756d0000001c53746f726167650001001c436f6e74656e740002003c4f7065726174696f6e73416c7068610003000c41707000040030446973747269627574696f6e000500384f7065726174696f6e73426574610006003c4f7065726174696f6e7347616d6d61000700284d656d62657273686970000800008101083470616c6c65745f636f6d6d6f6e2c42616c616e63654b696e6400010820506f736974697665000000204e65676174697665000100008501083870616c6c65745f636f6e74656e74205261774576656e746430436f6e74656e744163746f72018901204d656d626572496401203843757261746f7247726f7570496401202443757261746f72496401201c566964656f49640120244368616e6e656c496401201c4368616e6e656c018d0130446174614f626a6563744964012050456e676c69736841756374696f6e506172616d7301e101444f70656e41756374696f6e506172616d7301e901344f70656e41756374696f6e49640120544e667449737375616e6365506172616d657465727301ed011c42616c616e63650118644368616e6e656c4372656174696f6e506172616d657465727301f9015c4368616e6e656c557064617465506172616d65746572730125025c566964656f4372656174696f6e506172616d6574657273012d0254566964656f557064617465506172616d6574657273013502544368616e6e656c50726976696c6567654c6576656c0108704d6f6465726174696f6e5065726d697373696f6e7342794c6576656c013902645472616e73666572436f6d6d69746d656e745769746e6573730151023c50656e64696e675472616e7366657201d101244163636f756e7449640100785570646174654368616e6e656c5061796f757473506172616d65746572730155021c546f6b656e496401205c4368616e6e656c46756e647344657374696e6174696f6e01690201dc4c43757261746f7247726f757043726561746564040020013843757261746f7247726f757049640000007843757261746f7247726f75705065726d697373696f6e7355706461746564080020013843757261746f7247726f757049640000390201704d6f6465726174696f6e5065726d697373696f6e7342794c6576656c0001005443757261746f7247726f7570537461747573536574080020013843757261746f7247726f757049640000880110626f6f6c0002003043757261746f7241646465640c0020013843757261746f7247726f75704964000020012443757261746f7249640000a101015c4368616e6e656c4167656e745065726d697373696f6e730003003843757261746f7252656d6f766564080020013843757261746f7247726f75704964000020012443757261746f724964000400384368616e6e656c4372656174656410002001244368616e6e656c496400008d01011c4368616e6e656c0000f90101644368616e6e656c4372656174696f6e506172616d657465727300000001244163636f756e744964000500384368616e6e656c55706461746564100089010130436f6e74656e744163746f7200002001244368616e6e656c496400002502015c4368616e6e656c557064617465506172616d657465727300004d01015842547265655365743c446174614f626a65637449643e000600704368616e6e656c50726976696c6567654c6576656c5570646174656408002001244368616e6e656c496400000801544368616e6e656c50726976696c6567654c6576656c000700844368616e6e656c5374617465426c6f6174426f6e6456616c756555706461746564040018011c42616c616e63650008007c566964656f5374617465426c6f6174426f6e6456616c756555706461746564040018011c42616c616e6365000900504368616e6e656c41737365747352656d6f766564100089010130436f6e74656e744163746f7200002001244368616e6e656c496400004d01015842547265655365743c446174614f626a65637449643e00008d01011c4368616e6e656c000a00384368616e6e656c44656c65746564080089010130436f6e74656e744163746f7200002001244368616e6e656c4964000b00644368616e6e656c44656c6574656442794d6f64657261746f720c0089010130436f6e74656e744163746f7200002001244368616e6e656c4964000028011c5665633c75383e000c007c4368616e6e656c5669736962696c69747953657442794d6f64657261746f72100089010130436f6e74656e744163746f7200002001244368616e6e656c49640000880110626f6f6c000028011c5665633c75383e000d009c4368616e6e656c50617573656446656174757265735570646174656442794d6f64657261746f72100089010130436f6e74656e744163746f7200002001244368616e6e656c49640000bd01018042547265655365743c5061757361626c654368616e6e656c466561747572653e000028011c5665633c75383e000e007c4368616e6e656c41737365747344656c6574656442794d6f64657261746f72100089010130436f6e74656e744163746f7200002001244368616e6e656c496400004d01015842547265655365743c446174614f626a65637449643e000028011c5665633c75383e000f00544368616e6e656c46756e647357697468647261776e100089010130436f6e74656e744163746f7200002001244368616e6e656c4964000018011c42616c616e636500006902015c4368616e6e656c46756e647344657374696e6174696f6e001000804368616e6e656c526577617264436c61696d6564416e6457697468647261776e100089010130436f6e74656e744163746f7200002001244368616e6e656c4964000018011c42616c616e636500006902015c4368616e6e656c46756e647344657374696e6174696f6e00110030566964656f43726561746564140089010130436f6e74656e744163746f7200002001244368616e6e656c4964000020011c566964656f496400002d02015c566964656f4372656174696f6e506172616d657465727300004d01015842547265655365743c446174614f626a65637449643e00120030566964656f55706461746564100089010130436f6e74656e744163746f72000020011c566964656f4964000035020154566964656f557064617465506172616d657465727300004d01015842547265655365743c446174614f626a65637449643e00130030566964656f44656c65746564080089010130436f6e74656e744163746f72000020011c566964656f49640014005c566964656f44656c6574656442794d6f64657261746f720c0089010130436f6e74656e744163746f72000020011c566964656f4964000028011c5665633c75383e00150074566964656f5669736962696c69747953657442794d6f64657261746f72100089010130436f6e74656e744163746f72000020011c566964656f49640000880110626f6f6c000028011c5665633c75383e00160074566964656f41737365747344656c6574656442794d6f64657261746f72140089010130436f6e74656e744163746f72000020011c566964656f496400004d01015842547265655365743c446174614f626a65637449643e0000880110626f6f6c000028011c5665633c75383e001700544368616e6e656c5061796f757473557064617465640800550201785570646174654368616e6e656c5061796f757473506172616d65746572730000210101504f7074696f6e3c446174614f626a65637449643e001800504368616e6e656c52657761726455706461746564080018011c42616c616e636500002001244368616e6e656c496400190050436f756e63696c526577617264436c61696d656408002001244368616e6e656c4964000018011c42616c616e6365001a0054456e676c69736841756374696f6e537461727465640c0089010130436f6e74656e744163746f72000020011c566964656f49640000e1010150456e676c69736841756374696f6e506172616d73001b00484f70656e41756374696f6e53746172746564100089010130436f6e74656e744163746f72000020011c566964656f49640000e90101444f70656e41756374696f6e506172616d7300002001344f70656e41756374696f6e4964001c00244e66744973737565640c0089010130436f6e74656e744163746f72000020011c566964656f49640000ed0101544e667449737375616e6365506172616d6574657273001d00304e667444657374726f796564080089010130436f6e74656e744163746f72000020011c566964656f4964001e003841756374696f6e4269644d61646510002001204d656d6265724964000020011c566964656f4964000018011c42616c616e63650000210101404f7074696f6e3c4d656d62657249643e001f004841756374696f6e42696443616e63656c656408002001204d656d6265724964000020011c566964656f49640020003c41756374696f6e43616e63656c6564080089010130436f6e74656e744163746f72000020011c566964656f496400210054456e676c69736841756374696f6e536574746c65640c002001204d656d626572496400000001244163636f756e744964000020011c566964656f4964002200604269644d616465436f6d706c6574696e6741756374696f6e0c002001204d656d6265724964000020011c566964656f49640000210101404f7074696f6e3c4d656d62657249643e002300584f70656e41756374696f6e4269644163636570746564100089010130436f6e74656e744163746f72000020011c566964656f496400002001204d656d6265724964000018011c42616c616e6365002400304f6666657253746172746564100020011c566964656f4964000089010130436f6e74656e744163746f7200002001204d656d626572496400003101013c4f7074696f6e3c42616c616e63653e002500344f666665724163636570746564040020011c566964656f4964002600344f6666657243616e63656c6564080020011c566964656f4964000089010130436f6e74656e744163746f72002700404e667453656c6c4f726465724d6164650c0020011c566964656f4964000089010130436f6e74656e744163746f72000018011c42616c616e6365002800244e6674426f75676874080020011c566964656f496400002001204d656d6265724964002900384275794e6f7743616e63656c6564080020011c566964656f4964000089010130436f6e74656e744163746f72002a00484275794e6f775072696365557064617465640c0020011c566964656f4964000089010130436f6e74656e744163746f72000018011c42616c616e6365002b00844e6674536c696e6765644261636b546f5468654f726967696e616c417274697374080020011c566964656f4964000089010130436f6e74656e744163746f72002c00504368616e6e656c4f776e657252656d61726b656408002001244368616e6e656c4964000028011c5665633c75383e002d046c4d65746170726f746f636f6c732072656c61746564206576656e74504368616e6e656c4167656e7452656d61726b65640c0089010130436f6e74656e744163746f7200002001244368616e6e656c4964000028011c5665633c75383e002e00404e66744f776e657252656d61726b65640c0089010130436f6e74656e744163746f72000020011c566964656f4964000028011c5665633c75383e002f0068496e697469616c697a65644368616e6e656c5472616e736665720c002001244368616e6e656c4964000089010130436f6e74656e744163746f720000d101013c50656e64696e675472616e736665720030005443616e63656c4368616e6e656c5472616e7366657208002001244368616e6e656c4964000089010130436f6e74656e744163746f720031005c4368616e6e656c5472616e73666572416363657074656408002001244368616e6e656c49640000510201645472616e73666572436f6d6d69746d656e745769746e65737300320054476c6f62616c4e66744c696d69745570646174656408006d0201384e66744c696d6974506572696f64000020010c753634003300584368616e6e656c4e66744c696d697455706461746564100089010130436f6e74656e744163746f7200006d0201384e66744c696d6974506572696f6400002001244368616e6e656c4964000020010c75363400340040546f67676c65644e66744c696d6974730400880110626f6f6c0035004843726561746f72546f6b656e4973737565640c0089010130436f6e74656e744163746f7200002001244368616e6e656c4964000020011c546f6b656e4964003600085c4576656e747320666f722074686973206d6f64756c652e0089010c3870616c6c65745f636f6e74656e742c7065726d697373696f6e7330436f6e74656e744163746f720c3843757261746f7247726f7570496401202443757261746f7249640120204d656d62657249640120010c1c43757261746f72080020013843757261746f7247726f75704964000020012443757261746f724964000000184d656d62657204002001204d656d6265724964000100104c656164000200008d010c3870616c6c65745f636f6e74656e74147479706573344368616e6e656c5265636f72642c204d656d626572496401203843757261746f7247726f7570496401201c42616c616e63650118544368616e6e656c50726976696c6567654c6576656c01082c426c6f636b4e756d62657201101c546f6b656e49640120285472616e7366657249640120404368616e6e656c4173736574735365740191015c4368616e6e656c436f6c6c61626f7261746f72734d617001950144506175736564466561747572657353657401b50148526570617961626c65426c6f6174426f6e6401c501003801146f776e6572c90101984368616e6e656c4f776e65723c4d656d62657249642c2043757261746f7247726f757049643e0001286e756d5f766964656f7320010c753634000134636f6c6c61626f7261746f72739501015c4368616e6e656c436f6c6c61626f7261746f72734d617000016463756d756c61746976655f7265776172645f636c61696d656418011c42616c616e636500013c70726976696c6567655f6c6576656c0801544368616e6e656c50726976696c6567654c6576656c00013c7061757365645f6665617475726573b5010144506175736564466561747572657353657400013c7472616e736665725f737461747573cd010179014368616e6e656c5472616e736665725374617475733c4d656d62657249642c2043757261746f7247726f757049642c2042616c616e63652c205472616e7366657249642c0a4368616e6e656c436f6c6c61626f7261746f72734d61702c3e000130646174615f6f626a65637473910101404368616e6e656c41737365747353657400013c6461696c795f6e66745f6c696d6974d901016c4c696d6974506572506572696f643c426c6f636b4e756d6265723e0001407765656b6c795f6e66745f6c696d6974d901016c4c696d6974506572506572696f643c426c6f636b4e756d6265723e0001446461696c795f6e66745f636f756e746572dd01015c4e6674436f756e7465723c426c6f636b4e756d6265723e0001487765656b6c795f6e66745f636f756e746572dd01015c4e6674436f756e7465723c426c6f636b4e756d6265723e00014063726561746f725f746f6b656e5f69642101013c4f7074696f6e3c546f6b656e49643e0001606368616e6e656c5f73746174655f626c6f61745f626f6e64c5010148526570617961626c65426c6f6174426f6e640000910110346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000950110346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b01200456019901045300000400a901013842547265654d61703c4b2c20563e0000990110346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e6465644254726565536574080454019d01045300000400a101012c42547265655365743c543e00009d01103870616c6c65745f636f6e74656e74147479706573386974657261626c655f656e756d735c4368616e6e656c416374696f6e5065726d697373696f6e000154545570646174654368616e6e656c4d657461646174610000006c4d616e6167654e6f6e566964656f4368616e6e656c417373657473000100684d616e6167654368616e6e656c436f6c6c61626f7261746f72730002004c557064617465566964656f4d6574616461746100030020416464566964656f000400444d616e616765566964656f4173736574730005003444656c6574654368616e6e656c0006002c44656c657465566964656f0007003c4d616e616765566964656f4e6674730008002c4167656e7452656d61726b0009003c5472616e736665724368616e6e656c000a0048436c61696d4368616e6e656c526577617264000b0068576974686472617746726f6d4368616e6e656c42616c616e6365000c0044497373756543726561746f72546f6b656e000d0068436c61696d43726561746f72546f6b656e506174726f6e616765000e0074496e6974416e644d616e61676543726561746f72546f6b656e53616c65000f006843726561746f72546f6b656e4973737565725472616e73666572001000784d616b6543726561746f72546f6b656e5065726d697373696f6e6c6573730011007c52656475636543726561746f72546f6b656e506174726f6e616765526174650012004c4d616e616765526576656e756553706c6974730013004c4465697373756543726561746f72546f6b656e00140000a10104204254726565536574040454019d01000400a501000000a5010000029d0100a901042042547265654d617008044b01200456019901000400ad01000000ad01000002b10100b1010000040820990100b50110346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401b901045300000400bd01012c42547265655365743c543e0000b901143870616c6c65745f636f6e74656e742c7065726d697373696f6e733463757261746f725f67726f7570386974657261626c655f656e756d73585061757361626c654368616e6e656c4665617475726500011c504368616e6e656c46756e64735472616e736665720000003843726561746f72436173686f757400010040566964656f4e667449737375616e636500020034566964656f4372656174696f6e0003002c566964656f557064617465000400344368616e6e656c5570646174650005005043726561746f72546f6b656e49737375616e636500060000bd010420425472656553657404045401b901000400c101000000c101000002b90100c5010c3470616c6c65745f636f6d6d6f6e28626c6f61745f626f6e6448526570617961626c65426c6f6174426f6e6408244163636f756e74496401001c42616c616e636501180008015c72657061796d656e745f726573747269637465645f746fe801444f7074696f6e3c4163636f756e7449643e000118616d6f756e7418011c42616c616e63650000c9010c3870616c6c65745f636f6e74656e74147479706573304368616e6e656c4f776e657208204d656d626572496401203843757261746f7247726f7570496401200108184d656d62657204002001204d656d62657249640000003043757261746f7247726f7570040020013843757261746f7247726f7570496400010000cd010c3870616c6c65745f636f6e74656e74147479706573544368616e6e656c5472616e7366657253746174757314204d656d626572496401203843757261746f7247726f7570496401201c42616c616e63650118285472616e73666572496401205c4368616e6e656c436f6c6c61626f7261746f72734d61700195010108404e6f4163746976655472616e736665720000003c50656e64696e675472616e736665720400d101015d0150656e64696e675472616e736665723c4d656d62657249642c2043757261746f7247726f757049642c2042616c616e63652c205472616e7366657249642c0a4368616e6e656c436f6c6c61626f7261746f72734d61703e00010000d1010c3870616c6c65745f636f6e74656e741474797065733c50656e64696e675472616e7366657214204d656d626572496401203843757261746f7247726f7570496401201c42616c616e63650118285472616e73666572496401205c4368616e6e656c436f6c6c61626f7261746f72734d6170019501000801246e65775f6f776e6572c90101984368616e6e656c4f776e65723c4d656d62657249642c2043757261746f7247726f757049643e00013c7472616e736665725f706172616d73d5010129015472616e73666572436f6d6d69746d656e74506172616d65746572733c4368616e6e656c436f6c6c61626f7261746f72734d61702c2042616c616e63652c205472616e7366657249643e0000d5010c3870616c6c65745f636f6e74656e74147479706573705472616e73666572436f6d6d69746d656e74506172616d65746572730c5c4368616e6e656c436f6c6c61626f7261746f72734d61700195011c42616c616e63650118285472616e7366657249640120000c01446e65775f636f6c6c61626f7261746f72739501015c4368616e6e656c436f6c6c61626f7261746f72734d6170000114707269636518011c42616c616e636500012c7472616e736665725f69642001285472616e7366657249640000d9010c3870616c6c65745f636f6e74656e74147479706573384c696d6974506572506572696f64042c426c6f636b4e756d6265720110000801146c696d697420010c75363400014c626c6f636b5f6e756d6265725f706572696f6410012c426c6f636b4e756d6265720000dd010c3870616c6c65745f636f6e74656e74147479706573284e6674436f756e746572042c426c6f636b4e756d62657201100008011c636f756e74657220010c7536340001306c6173745f7570646174656410012c426c6f636b4e756d6265720000e101103870616c6c65745f636f6e74656e740c6e667414747970657368456e676c69736841756374696f6e506172616d735265636f72640c2c426c6f636b4e756d62657201101c42616c616e63650118204d656d62657249640120001c01387374617274696e675f707269636518011c42616c616e63650001346275795f6e6f775f70726963653101013c4f7074696f6e3c42616c616e63653e00012477686974656c6973744d01014842547265655365743c4d656d62657249643e0001247374617274735f6174e501014c4f7074696f6e3c426c6f636b4e756d6265723e0001206475726174696f6e10012c426c6f636b4e756d626572000140657874656e73696f6e5f706572696f6410012c426c6f636b4e756d6265720001306d696e5f6269645f7374657018011c42616c616e63650000e50104184f7074696f6e04045401100108104e6f6e6500000010536f6d650400100000010000e901103870616c6c65745f636f6e74656e740c6e66741474797065735c4f70656e41756374696f6e506172616d735265636f72640c2c426c6f636b4e756d62657201101c42616c616e63650118204d656d62657249640120001401387374617274696e675f707269636518011c42616c616e63650001346275795f6e6f775f70726963653101013c4f7074696f6e3c42616c616e63653e0001247374617274735f6174e501014c4f7074696f6e3c426c6f636b4e756d6265723e00012477686974656c6973744d01014842547265655365743c4d656d62657249643e0001446269645f6c6f636b5f6475726174696f6e10012c426c6f636b4e756d6265720000ed01103870616c6c65745f636f6e74656e740c6e66741474797065736c4e667449737375616e6365506172616d65746572735265636f726408204d656d626572496401205c496e69745472616e73616374696f6e616c53746174757301f1010010011c726f79616c7479f501013c4f7074696f6e3c526f79616c74793e0001306e66745f6d6574616461746128012c4e66744d657461646174610001446e6f6e5f6368616e6e656c5f6f776e6572210101404f7074696f6e3c4d656d62657249643e000164696e69745f7472616e73616374696f6e616c5f737461747573f101015c496e69745472616e73616374696f6e616c5374617475730000f101103870616c6c65745f636f6e74656e740c6e667414747970657374496e69745472616e73616374696f6e616c5374617475735265636f72641050456e676c69736841756374696f6e506172616d7301e101444f70656e41756374696f6e506172616d7301e901204d656d626572496401201c42616c616e6365011801141049646c65000000184275794e6f77040018011c42616c616e636500010058496e697469617465644f66666572546f4d656d62657208002001204d656d626572496400003101013c4f7074696f6e3c42616c616e63653e00020038456e676c69736841756374696f6e0400e1010150456e676c69736841756374696f6e506172616d730003002c4f70656e41756374696f6e0400e90101444f70656e41756374696f6e506172616d7300040000f50104184f7074696f6e040454019c0108104e6f6e6500000010536f6d6504009c0000010000f9010c3870616c6c65745f636f6e74656e741474797065737c4368616e6e656c4372656174696f6e506172616d65746572735265636f7264143453746f7261676541737365747301fd01204d656d626572496401203c53746f726167654275636b65744964012050446973747269627574696f6e4275636b657449640109021c42616c616e63650118001c01186173736574730d0201544f7074696f6e3c53746f726167654173736574733e0001106d6574611d01013c4f7074696f6e3c5665633c75383e3e000134636f6c6c61626f7261746f7273110201ac42547265654d61703c4d656d62657249642c204368616e6e656c4167656e745065726d697373696f6e733e00013c73746f726167655f6275636b6574734d01016442547265655365743c53746f726167654275636b657449643e000150646973747269627574696f6e5f6275636b6574731d02017842547265655365743c446973747269627574696f6e4275636b657449643e00018465787065637465645f6368616e6e656c5f73746174655f626c6f61745f626f6e6418011c42616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e63650000fd010c3870616c6c65745f636f6e74656e741474797065734c53746f726167654173736574735265636f7264041c42616c616e63650118000801506f626a6563745f6372656174696f6e5f6c697374010201845665633c446174614f626a6563744372656174696f6e506172616d65746572733e00015865787065637465645f646174615f73697a655f66656518011c42616c616e6365000001020000020502000502083870616c6c65745f73746f7261676570446174614f626a6563744372656174696f6e506172616d6574657273000008011073697a6520010c75363400013c697066735f636f6e74656e745f696428011c5665633c75383e00000902083870616c6c65745f73746f7261676568446973747269627574696f6e4275636b657449645265636f72640868446973747269627574696f6e4275636b657446616d696c79496401205c446973747269627574696f6e4275636b6574496e646578012000080174646973747269627574696f6e5f6275636b65745f66616d696c795f6964200168446973747269627574696f6e4275636b657446616d696c794964000164646973747269627574696f6e5f6275636b65745f696e64657820015c446973747269627574696f6e4275636b6574496e64657800000d0204184f7074696f6e04045401fd010108104e6f6e6500000010536f6d650400fd0100000100001102042042547265654d617008044b0120045601a1010004001502000000150200000219020019020000040820a101001d02042042547265655365740404540109020004002102000000210200000209020025020c3870616c6c65745f636f6e74656e74147479706573744368616e6e656c557064617465506172616d65746572735265636f7264103453746f7261676541737365747301fd0130446174614f626a65637449640120204d656d626572496401201c42616c616e63650118001801406173736574735f746f5f75706c6f61640d0201544f7074696f6e3c53746f726167654173736574733e0001206e65775f6d6574611d01013c4f7074696f6e3c5665633c75383e3e0001406173736574735f746f5f72656d6f76654d01015842547265655365743c446174614f626a65637449643e000134636f6c6c61626f7261746f7273290201cc4f7074696f6e3c42547265654d61703c4d656d62657249642c204368616e6e656c4167656e745065726d697373696f6e733e3e00019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500016c73746f726167655f6275636b6574735f6e756d5f7769746e657373e501012c4f7074696f6e3c7533323e0000290204184f7074696f6e0404540111020108104e6f6e6500000010536f6d650400110200000100002d020c3870616c6c65745f636f6e74656e7414747970657374566964656f4372656174696f6e506172616d65746572735265636f72640c3453746f7261676541737365747301fd01544e667449737375616e6365506172616d657465727301ed011c42616c616e63650118001801186173736574730d0201544f7074696f6e3c53746f726167654173736574733e0001106d6574611d01013c4f7074696f6e3c5665633c75383e3e0001386175746f5f69737375655f6e6674310201744f7074696f6e3c4e667449737375616e6365506172616d65746572733e00017c65787065637465645f766964656f5f73746174655f626c6f61745f626f6e6418011c42616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500016c73746f726167655f6275636b6574735f6e756d5f7769746e65737310010c7533320000310204184f7074696f6e04045401ed010108104e6f6e6500000010536f6d650400ed01000001000035020c3870616c6c65745f636f6e74656e741474797065736c566964656f557064617465506172616d65746572735265636f7264103453746f7261676541737365747301fd0130446174614f626a65637449640120544e667449737375616e6365506172616d657465727301ed011c42616c616e63650118001801406173736574735f746f5f75706c6f61640d0201544f7074696f6e3c53746f726167654173736574733e0001206e65775f6d6574611d01013c4f7074696f6e3c5665633c75383e3e0001406173736574735f746f5f72656d6f76654d01015842547265655365743c446174614f626a65637449643e0001386175746f5f69737375655f6e6674310201744f7074696f6e3c4e667449737375616e6365506172616d65746572733e00019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500016c73746f726167655f6275636b6574735f6e756d5f7769746e657373e501012c4f7074696f6e3c7533323e00003902042042547265654d617008044b01080456013d0200040049020000003d020420425472656553657404045401410200040045020000004102143870616c6c65745f636f6e74656e742c7065726d697373696f6e733463757261746f725f67726f7570386974657261626c655f656e756d735c436f6e74656e744d6f6465726174696f6e416374696f6e0001202448696465566964656f0000002c486964654368616e6e656c000100684368616e67654368616e6e656c466561747572655374617475730400b90101585061757361626c654368616e6e656c466561747572650002002c44656c657465566964656f0003003444656c6574654368616e6e656c0004004444656c657465566964656f4173736574730400880110626f6f6c0005006c44656c6574654e6f6e566964656f4368616e6e656c417373657473000600585570646174654368616e6e656c4e66744c696d69747300070000450200000241020049020000024d02004d0200000408083d020051020c3870616c6c65745f636f6e74656e74147479706573705472616e73666572436f6d6d69746d656e74506172616d65746572730c5c4368616e6e656c436f6c6c61626f7261746f72734d61700111021c42616c616e63650118285472616e7366657249640120000c01446e65775f636f6c6c61626f7261746f72731102015c4368616e6e656c436f6c6c61626f7261746f72734d6170000114707269636518011c42616c616e636500012c7472616e736665725f69642001285472616e736665724964000055020c3870616c6c65745f636f6e74656e74147479706573905570646174654368616e6e656c5061796f757473506172616d65746572735265636f72640c7c4368616e6e656c5061796f7574735061796c6f6164506172616d65746572730159021c42616c616e636501181048617368012400140128636f6d6d69746d656e745d0201304f7074696f6e3c486173683e00011c7061796c6f61646102019c4f7074696f6e3c4368616e6e656c5061796f7574735061796c6f6164506172616d65746572733e00014c6d696e5f636173686f75745f616c6c6f7765643101013c4f7074696f6e3c42616c616e63653e00014c6d61785f636173686f75745f616c6c6f7765643101013c4f7074696f6e3c42616c616e63653e0001606368616e6e656c5f636173686f7574735f656e61626c6564650201304f7074696f6e3c626f6f6c3e000059020c3870616c6c65745f636f6e74656e74147479706573944368616e6e656c5061796f7574735061796c6f6164506172616d65746572735265636f726408244163636f756e74496401001c42616c616e636501180010014075706c6f616465725f6163636f756e740001244163636f756e7449640001586f626a6563745f6372656174696f6e5f706172616d7305020170446174614f626a6563744372656174696f6e506172616d657465727300015865787065637465645f646174615f73697a655f66656518011c42616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500005d0204184f7074696f6e04045401240108104e6f6e6500000010536f6d650400240000010000610204184f7074696f6e0404540159020108104e6f6e6500000010536f6d65040059020000010000650204184f7074696f6e04045401880108104e6f6e6500000010536f6d65040088000001000069020c3870616c6c65745f636f6e74656e741474797065735c4368616e6e656c46756e647344657374696e6174696f6e04244163636f756e74496401000108244163636f756e74496404000001244163636f756e74496400000034436f756e63696c427564676574000100006d020c3870616c6c65745f636f6e74656e74147479706573384e66744c696d6974506572696f64000108144461696c79000000185765656b6c79000100007102083870616c6c65745f73746f72616765205261774576656e74303c53746f726167654275636b65744964012020576f726b65724964012030446174614f626a656374496401204055706c6f6164506172616d65746572730175021442616749640179023044796e616d69634261674964018102244163636f756e74496401001c42616c616e6365011868446973747269627574696f6e4275636b657446616d696c794964012050446973747269627574696f6e4275636b657449640109025c446973747269627574696f6e4275636b6574496e64657801207044796e616d69634261674372656174696f6e506172616d657465727301850201a85053746f726167654275636b657443726561746564140020013c53746f726167654275636b657449640000210101404f7074696f6e3c576f726b657249643e0000880110626f6f6c000020010c753634000020010c75363400001c94456d697473206f6e206372656174696e67207468652073746f72616765206275636b65742e18506172616d734c2d2073746f72616765206275636b6574204944402d20696e766974656420776f726b65726c2d20666c61672022616363657074696e675f6e65775f6261677322642d2073697a65206c696d697420666f7220766f75636865722c702d206f626a65637473206c696d697420666f7220766f75636865722c7c53746f726167654275636b6574496e7669746174696f6e41636365707465640c0020013c53746f726167654275636b657449640000200120576f726b6572496400000001244163636f756e744964000114c4456d697473206f6e20616363657074696e67207468652073746f72616765206275636b657420696e7669746174696f6e2e18506172616d734c2d2073746f72616765206275636b65742049444c2d20696e766974656420776f726b65722049445c2d207472616e736163746f72206163636f756e742049446c53746f726167654275636b65747355706461746564466f724261670c0079020114426167496400004d01016442547265655365743c53746f726167654275636b657449643e00004d01016442547265655365743c53746f726167654275636b657449643e000214a8456d697473206f6e207570646174696e672073746f72616765206275636b65747320666f72206261672e18506172616d73202d20626167204944982d2073746f72616765206275636b65747320746f2061646420494420636f6c6c656374696f6ea42d2073746f72616765206275636b65747320746f2072656d6f766520494420636f6c6c656374696f6e4c446174614f626a6563747355706c6f616465640c004d01015842547265655365743c446174614f626a65637449643e00007502014055706c6f6164506172616d6574657273000018011c42616c616e636500031480456d697473206f6e2075706c6f6164696e672064617461206f626a656374732e18506172616d73482d2064617461206f626a6563747320494473782d20696e697469616c2075706c6f6164696e6720706172616d6574657273782d20737461746520626c6f617420626f6e6420666f72206f626a656374736853746f726167654f70657261746f724d657461646174615365740c0020013c53746f726167654275636b657449640000200120576f726b65724964000028011c5665633c75383e000414bc456d697473206f6e2073657474696e67207468652073746f72616765206f70657261746f72206d657461646174612e18506172616d734c2d2073746f72616765206275636b65742049444c2d20696e766974656420776f726b6572204944282d206d657461646174617453746f726167654275636b6574566f75636865724c696d6974735365740c0020013c53746f726167654275636b65744964000020010c753634000020010c753634000514cc456d697473206f6e2073657474696e67207468652073746f72616765206275636b657420766f7563686572206c696d6974732e18506172616d734c2d2073746f72616765206275636b6574204944782d206e657720746f74616c206f626a656374732073697a65206c696d6974802d206e657720746f74616c206f626a65637473206e756d626572206c696d69746850656e64696e67446174614f626a656374734163636570746564100020013c53746f726167654275636b657449640000200120576f726b65724964000079020114426167496400004d01015842547265655365743c446174614f626a65637449643e000618a0456d697473206f6e20616363657074696e672070656e64696e672064617461206f626a656374732e18506172616d734c2d2073746f72616765206275636b6574204944842d20776f726b6572204944202873746f726167652070726f766964657220494429202d20626167204944582d2070656e64696e672064617461206f626a656374738053746f726167654275636b6574496e7669746174696f6e43616e63656c6c6564040020013c53746f726167654275636b6574496400070cc8456d697473206f6e2063616e63656c6c696e67207468652073746f72616765206275636b657420696e7669746174696f6e2e18506172616d734c2d2073746f72616765206275636b65742049447053746f726167654275636b65744f70657261746f72496e7669746564080020013c53746f726167654275636b657449640000200120576f726b65724964000810c0456d697473206f6e207468652073746f72616765206275636b6574206f70657261746f7220696e7669746174696f6e2e18506172616d734c2d2073746f72616765206275636b6574204944a82d206f70657261746f7220776f726b6572204944202873746f726167652070726f7669646572204944297053746f726167654275636b65744f70657261746f7252656d6f766564040020013c53746f726167654275636b6574496400090cb4456d697473206f6e207468652073746f72616765206275636b6574206f70657261746f722072656d6f76616c2e18506172616d734c2d2073746f72616765206275636b65742049446c55706c6f6164696e67426c6f636b537461747573557064617465640400880110626f6f6c000a0c0501456d697473206f6e206368616e67696e67207468652073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e18506172616d73302d206e6577207374617475737c446174614f626a6563745065724d6567616279746546656555706461746564040018011c42616c616e6365000b0c0501456d697473206f6e206368616e67696e67207468652073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e18506172616d734c2d206e657720646174612073697a65206665658053746f726167654275636b6574735065724261674c696d697455706461746564040010010c753332000c0cf4456d697473206f6e206368616e67696e6720746865202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742e18506172616d732c2d206e6577206c696d69749453746f726167654275636b657473566f75636865724d61784c696d69747355706461746564080020010c753634000020010c753634000d10ec456d697473206f6e206368616e67696e6720746865202253746f72616765206275636b65747320766f7563686572206d6178206c696d697473222e18506172616d73602d206e6577206f626a656374732073697a65206c696d6974682d206e6577206f626a65637473206e756d626572206c696d697440446174614f626a656374734d6f7665640c00790201144261674964000079020114426167496400004d01015842547265655365743c446174614f626a65637449643e000e14a8456d697473206f6e206d6f76696e672064617461206f626a65637473206265747765656e20626167732e18506172616d733c2d20736f7572636520626167204944502d2064657374696e6174696f6e20626167204944442d2064617461206f626a6563742049447348446174614f626a6563747344656c657465640c000001244163636f756e744964000079020114426167496400004d01015842547265655365743c446174614f626a65637449643e000f14a4456d697473206f6e2064617461206f626a656374732064656c6574696f6e2066726f6d20626167732e18506172616d73942d206163636f756e7420494420666f722074686520737461746520626c6f617420626f6e64202d20626167204944442d2064617461206f626a656374204944736853746f726167654275636b657453746174757355706461746564080020013c53746f726167654275636b657449640000880110626f6f6c00101098456d697473206f6e2073746f72616765206275636b657420737461747573207570646174652e18506172616d734c2d2073746f72616765206275636b6574204944302d206e6577207374617475733c557064617465426c61636b6c69737408008902014442547265655365743c5665633c75383e3e00008902014442547265655365743c5665633c75383e3e001110c4456d697473206f6e207570646174696e672074686520626c61636b6c69737420776974682064617461206861736865732e18506172616d73942d2068617368657320746f2072656d6f76652066726f6d2074686520626c61636b6c697374802d2068617368657320746f2061646420746f2074686520626c61636b6c6973744444796e616d696342616744656c6574656404008102013044796e616d6963426167496400120c80456d697473206f6e2064656c6574696e6720612064796e616d6963206261672e18506172616d73402d2064796e616d6963206261672049444444796e616d69634261674372656174656408008502017044796e616d69634261674372656174696f6e506172616d657465727300004d01015842547265655365743c446174614f626a65637449643e00131080456d697473206f6e206372656174696e6720612064796e616d6963206261672e18506172616d73842d2064796e616d696320626167206372656174696f6e20706172616d65746572736c2d2075706c6f616465642064617461206f626a656374732069647338566f75636865724368616e676564080020013c53746f726167654275636b6574496400009102011c566f7563686572001410cc456d697473206f6e206368616e67696e672074686520766f756368657220666f7220612073746f72616765206275636b65742e18506172616d734c2d2073746f72616765206275636b6574204944342d206e657720766f75636865725053746f726167654275636b657444656c65746564040020013c53746f726167654275636b6574496400150c84456d697473206f6e2073746f72616765206275636b65742064656c6574696e672e18506172616d734c2d2073746f72616765206275636b6574204944dc4e756d6265724f6653746f726167654275636b657473496e44796e616d69634261674372656174696f6e506f6c6963795570646174656408009502013844796e616d696342616754797065000010010c7533320016103d01456d697473206f6e207570646174696e6720746865206e756d626572206f662073746f72616765206275636b65747320696e2064796e616d696320626167206372656174696f6e20706f6c6963792e18506172616d73482d2064796e616d69632062616720747970657c2d206e6577206e756d626572206f662073746f72616765206275636b6574737c446973747269627574696f6e4275636b657446616d696c79437265617465640400200168446973747269627574696f6e4275636b657446616d696c79496400170cb4456d697473206f6e206372656174696e6720646973747269627574696f6e206275636b65742066616d696c792e18506172616d737c2d20646973747269627574696f6e2066616d696c79206275636b65742049447c446973747269627574696f6e4275636b657446616d696c7944656c657465640400200168446973747269627574696f6e4275636b657446616d696c79496400180cb4456d697473206f6e2064656c6574696e6720646973747269627574696f6e206275636b65742066616d696c792e18506172616d737c2d20646973747269627574696f6e2066616d696c79206275636b657420494464446973747269627574696f6e4275636b6574437265617465640c00200168446973747269627574696f6e4275636b657446616d696c7949640000880110626f6f6c000009020150446973747269627574696f6e4275636b6574496400191498456d697473206f6e206372656174696e6720646973747269627574696f6e206275636b65742e18506172616d737c2d20646973747269627574696f6e206275636b65742066616d696c79204944502d20616363657074696e67206e65772062616773602d20646973747269627574696f6e206275636b65742049447c446973747269627574696f6e4275636b657453746174757355706461746564080009020150446973747269627574696f6e4275636b657449640000880110626f6f6c001a10ec456d697473206f6e2073746f72616765206275636b657420737461747573207570646174652028616363657074696e67206e65772062616773292e18506172616d73602d20646973747269627574696f6e206275636b6574204944842d206e6577207374617475732028616363657074696e67206e657720626167732964446973747269627574696f6e4275636b657444656c65746564040009020150446973747269627574696f6e4275636b65744964001b0c98456d697473206f6e2064656c6574696e6720646973747269627574696f6e206275636b65742e18506172616d73602d20646973747269627574696f6e206275636b657420494480446973747269627574696f6e4275636b65747355706461746564466f7242616710007902011442616749640000200168446973747269627574696f6e4275636b657446616d696c79496400004d01018442547265655365743c446973747269627574696f6e4275636b6574496e6465783e00004d01018442547265655365743c446973747269627574696f6e4275636b6574496e6465783e001c14bc456d697473206f6e207570646174696e6720646973747269627574696f6e206275636b65747320666f72206261672e18506172616d73202d20626167204944982d2073746f72616765206275636b65747320746f2061646420494420636f6c6c656374696f6ea42d2073746f72616765206275636b65747320746f2072656d6f766520494420636f6c6c656374696f6e94446973747269627574696f6e4275636b6574735065724261674c696d697455706461746564040010010c753332001d0c0901456d697473206f6e206368616e67696e67207468652022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e18506172616d732c2d206e6577206c696d697474446973747269627574696f6e4275636b65744d6f646555706461746564080009020150446973747269627574696f6e4275636b657449640000880110626f6f6c001e10e0456d697473206f6e2073746f72616765206275636b6574206d6f6465207570646174652028646973747269627574696e6720666c6167292e18506172616d73602d20646973747269627574696f6e206275636b6574204944382d20646973747269627574696e67a446616d696c696573496e44796e616d69634261674372656174696f6e506f6c6963795570646174656408009502013844796e616d6963426167547970650000990201a442547265654d61703c446973747269627574696f6e4275636b657446616d696c7949642c207533323e001f102d01456d697473206f6e2064796e616d696320626167206372656174696f6e20706f6c696379207570646174652028646973747269627574696f6e206275636b65742066616d696c696573292e18506172616d73482d2064796e616d6963206261672074797065742d2066616d696c69657320616e64206275636b6574206e756d6265727384446973747269627574696f6e4275636b65744f70657261746f72496e7669746564080009020150446973747269627574696f6e4275636b657449640000200120576f726b657249640020101101456d697473206f6e206372656174696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e18506172616d73602d20646973747269627574696f6e206275636b65742049442c2d20776f726b657220494494446973747269627574696f6e4275636b6574496e7669746174696f6e43616e63656c6c6564080009020150446973747269627574696f6e4275636b657449640000200120576f726b657249640021101501456d697473206f6e2063616e63656c696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e18506172616d73602d20646973747269627574696f6e206275636b6574204944502d206f70657261746f7220776f726b657220494490446973747269627574696f6e4275636b6574496e7669746174696f6e41636365707465640800200120576f726b65724964000009020150446973747269627574696f6e4275636b657449640022101501456d697473206f6e20616363657074696e67206120646973747269627574696f6e206275636b657420696e7669746174696f6e20666f7220746865206f70657261746f722e18506172616d732c2d20776f726b6572204944602d20646973747269627574696f6e206275636b657420494474446973747269627574696f6e4275636b65744d657461646174615365740c00200120576f726b65724964000009020150446973747269627574696f6e4275636b65744964000028011c5665633c75383e0023140101456d697473206f6e2073657474696e6720746865206d65746164617461206279206120646973747269627574696f6e206275636b6574206f70657261746f722e18506172616d732c2d20776f726b6572204944602d20646973747269627574696f6e206275636b6574204944282d206d6574616461746184446973747269627574696f6e4275636b65744f70657261746f7252656d6f766564080009020150446973747269627574696f6e4275636b657449640000200120576f726b65724964002410c8456d697473206f6e2074686520646973747269627574696f6e206275636b6574206f70657261746f722072656d6f76616c2e18506172616d73602d20646973747269627574696f6e206275636b6574204944842d20646973747269627574696f6e206275636b6574206f70657261746f722049448c446973747269627574696f6e4275636b657446616d696c794d657461646174615365740800200168446973747269627574696f6e4275636b657446616d696c794964000028011c5665633c75383e002510f8456d697473206f6e2073657474696e6720746865206d65746164617461206279206120646973747269627574696f6e206275636b65742066616d696c792e18506172616d737c2d20646973747269627574696f6e206275636b65742066616d696c79204944282d206d6574616461746190446174614f626a6563745374617465426c6f6174426f6e6456616c756555706461746564040018011c42616c616e636500260ccc456d697473206f6e207570646174696e67207468652064617461206f626a65637420737461746520626c6f617420626f6e642e18506172616d73602d20737461746520626c6f617420626f6e642076616c756548446174614f626a65637473557064617465640c007502014055706c6f6164506172616d657465727300004d01015842547265655365743c446174614f626a65637449643e00004d01015842547265655365743c446174614f626a65637449643e0027140d01456d697473206f6e2073746f7261676520617373657473206265696e672075706c6f6164656420616e642064656c65746564206174207468652073616d652074696d6518506172616d73482d2055706c6f6164506172616d6574657273742d20496473206f66207468652075706c6f61646564206f626a65637473702d20496473206f66207468652072656d6f766564206f626a656374735c53746f726167654f70657261746f7252656d61726b65640c00200120576f726b65724964000020013c53746f726167654275636b65744964000028011c5665633c75383e002814a4456d697473206f6e2053746f72616765204f70657261746f72206d616b696e6720612072656d61726b18506172616d73582d206f70657261746f72277320776f726b65722069644c2d2073746f72616765206275636b6574206964402d2072656d61726b206d65737361676570446973747269627574696f6e4f70657261746f7252656d61726b65640c00200120576f726b65724964000009020150446973747269627574696f6e4275636b65744964000028011c5665633c75383e002914b8456d697473206f6e20446973747269627574696f6e204f70657261746f72206d616b696e6720612072656d61726b18506172616d73582d206f70657261746f72277320776f726b6572206964602d20646973747269627574696f6e206275636b6574206964402d2072656d61726b206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e003853746f72616765206576656e74737502083870616c6c65745f73746f726167655855706c6f6164506172616d65746572735265636f72640c144261674964017902244163636f756e74496401001c42616c616e63650118001401186261675f69647902011442616749640001506f626a6563745f6372656174696f6e5f6c697374010201845665633c446174614f626a6563744372656174696f6e506172616d65746572733e00018873746174655f626c6f61745f626f6e645f736f757263655f6163636f756e745f69640001244163636f756e74496400015865787065637465645f646174615f73697a655f66656518011c42616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500007902083870616c6c65745f73746f726167652442616749645479706508204d656d62657249640120244368616e6e656c4964012001081853746174696304007d02012c53746174696342616749640000001c44796e616d696304008102019444796e616d69634261674964547970653c4d656d62657249642c204368616e6e656c49643e000100007d02083870616c6c65745f73746f726167652c53746174696342616749640001081c436f756e63696c00000030576f726b696e6747726f757004007d010130576f726b696e6747726f7570000100008102083870616c6c65745f73746f726167654044796e616d696342616749645479706508204d656d62657249640120244368616e6e656c496401200108184d656d62657204002001204d656d62657249640000001c4368616e6e656c04002001244368616e6e656c4964000100008502083870616c6c65745f73746f726167657844796e4261674372656174696f6e506172616d65746572735265636f726414144261674964018102244163636f756e74496401001c42616c616e636501183c53746f726167654275636b65744964012050446973747269627574696f6e4275636b65744964010902001c01186261675f69648102011442616749640001506f626a6563745f6372656174696f6e5f6c697374010201845665633c446174614f626a6563744372656174696f6e506172616d65746572733e00018873746174655f626c6f61745f626f6e645f736f757263655f6163636f756e745f69640001244163636f756e74496400015865787065637465645f646174615f73697a655f66656518011c42616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6418011c42616c616e636500013c73746f726167655f6275636b6574734d01016442547265655365743c53746f726167654275636b657449643e000150646973747269627574696f6e5f6275636b6574731d02017842547265655365743c446973747269627574696f6e4275636b657449643e000089020420425472656553657404045401280004008d020000008d0200000228009102083870616c6c65745f73746f726167651c566f7563686572000010012873697a655f6c696d697420010c7536340001346f626a656374735f6c696d697420010c75363400012473697a655f7573656420010c7536340001306f626a656374735f7573656420010c75363400009502083870616c6c65745f73746f726167653844796e616d696342616754797065000108184d656d6265720000001c4368616e6e656c000100009902042042547265654d617008044b0120045601100004009d020000009d02000002a10200a10200000408201000a5020c5070616c6c65745f70726f6a6563745f746f6b656e186576656e7473205261774576656e74281c42616c616e63650118284a6f7942616c616e636501181c546f6b656e49640120244163636f756e7449640100204d656d626572496401202c426c6f636b4e756d6265720110385472616e73666572506f6c69637901a9025c546f6b656e49737375616e6365506172616d657465727301ad024856616c6964617465645472616e736665727301e10224546f6b656e53616c65010503014858546f6b656e416d6f756e745472616e73666572726564100020011c546f6b656e496400002001204d656d62657249640000e102014856616c6964617465645472616e7366657273000028011c5665633c75383e000018ac546f6b656e20616d6f756e74206973207472616e736665727265642066726f6d2073726320746f206473741c506172616d733a482d20746f6b656e206964656e746966696572482d20736f75726365206d656d62657220696459012d206d617020636f6e7461696e696e672076616c696461746564206f7574707574732028616d6f756e7420696e646578656420627920286d656d6265725f6964202b206163636f756e74206578697374616e63652929542d207472616e736665722773206d6574616461746178546f6b656e416d6f756e745472616e736665727265644279497373756572100020011c546f6b656e496400002001204d656d62657249640000e102014856616c6964617465645472616e7366657273000028011c5665633c75383e00012088546f6b656e20616d6f756e74207472616e73666572726564206279206973737565721c506172616d733a482d20746f6b656e206964656e7469666965726c2d20736f75726365202869737375657229206d656d626572206964882d206d617020636f6e7461696e696e672076616c696461746564206f7574707574732d01202028616d6f756e742c206f70742e2076657374696e67207363686564756c652c206f70742e2076657374696e6720636c65616e7570206b657929206461746120696e6465786564206279882020286163636f756e745f6964202b206163636f756e74206578697374616e636529542d207472616e736665722773206d6574616461746160506174726f6e61676552617465446563726561736564546f080020011c546f6b656e496400000903012c5065727175696e74696c6c00021060506174726f6e6167652072617465206465637265617365641c506172616d733a482d20746f6b656e206964656e746966696572502d206e657720706174726f6e616765207261746558506174726f6e616765437265646974436c61696d65640c0020011c546f6b656e4964000018011c42616c616e636500002001204d656d62657249640003148c506174726f6e6167652063726564697420636c61696d65642062792063726561746f721c506172616d733a482d20746f6b656e206964656e7469666965723c2d2063726564697420616d6f756e742c2d206d656d62657220696448526576656e756553706c6974497373756564100020011c546f6b656e4964000010012c426c6f636b4e756d626572000010012c426c6f636b4e756d62657200001801284a6f7942616c616e636500041850526576656e75652053706c6974206973737565641c506172616d733a482d20746f6b656e206964656e746966696572782d207374617274696e6720626c6f636b20666f72207468652073706c69745c2d206475726174696f6e206f66207468652073706c6974742d204a4f5920616c6c6f636174656420666f72207468652073706c697454526576656e756553706c697446696e616c697a65640c0020011c546f6b656e496400000001244163636f756e74496400001801284a6f7942616c616e63650005145c526576656e75652053706c69742066696e616c697a65641c506172616d733a482d20746f6b656e206964656e746966696572a42d207265636f76657279206163636f756e7420666f7220746865206c6566746f7665722066756e6473402d206c6566746f7665722066756e64735c55736572506172746963697061746564496e53706c6974140020011c546f6b656e496400002001204d656d6265724964000018011c42616c616e636500001801284a6f7942616c616e63650000100138526576656e756553706c6974496400061c8855736572207061727469706174656420696e206120726576656e75652073706c69741c506172616d733a482d20746f6b656e206964656e746966696572642d207061727469636970616e742773206d656d6265722069647c2d207573657220616c6c6f6361746564207374616b65642062616c616e63657c2d206469766964656e6420616d6f756e7420284a4f5929206772616e746564682d20726576656e75652073706c6974206964656e74696669657240526576656e756553706c69744c6566740c0020011c546f6b656e496400002001204d656d6265724964000018011c42616c616e63650007145c55736572206c65667420726576656e75652073706c69741c506172616d733a482d20746f6b656e206964656e746966696572702d2065782d7061727469636970616e742773206d656d626572206964442d20616d6f756e7420756e7374616b6564544d656d6265724a6f696e656457686974656c6973740c0020011c546f6b656e496400002001204d656d62657249640000a90201385472616e73666572506f6c6963790008145c4d656d626572206a6f696e65642077686974656c6973741c506172616d733a482d20746f6b656e206964656e7469666965722c2d206d656d626572206964642d206f6e676f696e67207472616e7366657220706f6c6963793c4163636f756e744475737465644279100020011c546f6b656e496400002001204d656d626572496400000001244163636f756e7449640000a90201385472616e73666572506f6c696379000918384163636f756e74204475737465641c506172616d733a482d20746f6b656e206964656e7469666965729c2d206964206f662074686520647573746564206163636f756e74206f776e6572206d656d6265728c2d206163636f756e7420746861742063616c6c6564207468652065787472696e736963402d206f6e676f696e6720706f6c69637934546f6b656e4465697373756564040020011c546f6b656e4964000a0c38546f6b656e2044656973737565641c506172616d733a282d20746f6b656e2069642c546f6b656e497373756564080020011c546f6b656e49640000ad02015c546f6b656e49737375616e6365506172616d6574657273000b1030546f6b656e204973737565641c506172616d733a282d20746f6b656e2069646c2d20746f6b656e2069737375616e636520706172616d657465727350546f6b656e53616c65496e697469616c697a6564100020011c546f6b656e4964000010012c546f6b656e53616c654964000005030124546f6b656e53616c6500001d01013c4f7074696f6e3c5665633c75383e3e000c1864546f6b652053616c652077617320496e697469616c697a65641c506172616d733a282d20746f6b656e2069643c2d20746f6b656e2073616c65206964442d20746f6b656e2073616c652064617461542d20746f6b656e2073616c65206d65746164617461605570636f6d696e67546f6b656e53616c6555706461746564100020011c546f6b656e4964000010012c546f6b656e53616c6549640000e501014c4f7074696f6e3c426c6f636b4e756d6265723e0000e501014c4f7074696f6e3c426c6f636b4e756d6265723e000d187c5570636f6d696e6720546f6b656e2053616c652077617320557064617465641c506172616d733a282d20746f6b656e2069643c2d20746f6b656e2073616c65206964582d206e65772073616c6520737461727420626c6f636b4c2d206e65772073616c65206475726174696f6e54546f6b656e735075726368617365644f6e53616c65100020011c546f6b656e4964000010012c546f6b656e53616c654964000018011c42616c616e636500002001204d656d6265724964000e1860546f6b656e7320507572636861736564204f6e2053616c651c506172616d733a282d20746f6b656e2069643c2d20746f6b656e2073616c65206964702d20616d6f756e74206f6620746f6b656e73207075726368617365644c2d2062757965722773206d656d62657220696448546f6b656e53616c6546696e616c697a6564100020011c546f6b656e4964000010012c546f6b656e53616c654964000018011c42616c616e636500001801284a6f7942616c616e6365000f1850546f6b656e2053616c652046696e616c697a65641c506172616d733a282d20746f6b656e2069643c2d20746f6b656e2073616c652069648c2d20616d6f756e74206f6620756e736f6c6420746f6b656e73207265636f7665726564642d20616d6f756e74206f66204a4f5920636f6c6c6563746564945472616e73666572506f6c6963794368616e676564546f5065726d697373696f6e6c657373040020011c546f6b656e496400100ca45472616e7366657220506f6c696379204368616e67656420546f205065726d697373696f6e6c6573731c506172616d733a282d20746f6b656e20696430546f6b656e734275726e65640c0020011c546f6b656e496400002001204d656d6265724964000018011c42616c616e636500111434546f6b656e73204275726e65641c506172616d733a282d20746f6b656e2069642c2d206d656d626572206964642d206e756d626572206f6620746f6b656e73206275726e6564085c4576656e747320666f722074686973206d6f64756c652e00a9020c5070616c6c65745f70726f6a6563745f746f6b656e147479706573385472616e73666572506f6c69637904104861736801240108385065726d697373696f6e6c657373000000305065726d697373696f6e656404002401104861736800010000ad020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065735c546f6b656e49737375616e6365506172616d657465727310104861736801243c546f6b656e416c6c6f636174696f6e01b102505472616e73666572506f6c696379506172616d7301c102204d656d6265724964012000140148696e697469616c5f616c6c6f636174696f6ed102018c42547265654d61703c4d656d62657249642c20546f6b656e416c6c6f636174696f6e3e00011873796d626f6c2401104861736800013c7472616e736665725f706f6c696379c10201505472616e73666572506f6c696379506172616d73000138706174726f6e6167655f72617465dd020128596561726c7952617465000148726576656e75655f73706c69745f72617465b902011c5065726d696c6c0000b1020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065733c546f6b656e416c6c6f636174696f6e081c42616c616e636501185456657374696e675363686564756c65506172616d7301b50200080118616d6f756e7418011c42616c616e636500015c76657374696e675f7363686564756c655f706172616d73bd0201744f7074696f6e3c56657374696e675363686564756c65506172616d733e0000b5020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065735456657374696e675363686564756c65506172616d73042c426c6f636b4e756d6265720110000c015c6c696e6561725f76657374696e675f6475726174696f6e10012c426c6f636b4e756d62657200014c626c6f636b735f6265666f72655f636c69666610012c426c6f636b4e756d62657200015c636c6966665f616d6f756e745f70657263656e74616765b902011c5065726d696c6c0000b9020c3473705f61726974686d65746963287065725f7468696e67731c5065726d696c6c0000040010010c7533320000bd0204184f7074696f6e04045401b5020108104e6f6e6500000010536f6d650400b5020000010000c1020c5070616c6c65745f70726f6a6563745f746f6b656e147479706573505472616e73666572506f6c696379506172616d73043c57686974656c697374506172616d7301c5020108385065726d697373696f6e6c657373000000305065726d697373696f6e65640400c502013c57686974656c697374506172616d7300010000c5020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065733c57686974656c697374506172616d7308104861736801247053696e676c65446174614f626a65637455706c6f6164506172616d7301c90200080128636f6d6d69746d656e742401104861736800011c7061796c6f6164cd0201904f7074696f6e3c53696e676c65446174614f626a65637455706c6f6164506172616d733e0000c9020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065737053696e676c65446174614f626a65637455706c6f6164506172616d7304284a6f7942616c616e63650118000c01586f626a6563745f6372656174696f6e5f706172616d7305020170446174614f626a6563744372656174696f6e506172616d657465727300015865787065637465645f646174615f73697a655f6665651801284a6f7942616c616e636500019465787065637465645f646174615f6f626a6563745f73746174655f626c6f61745f626f6e641801284a6f7942616c616e63650000cd0204184f7074696f6e04045401c9020108104e6f6e6500000010536f6d650400c9020000010000d102042042547265654d617008044b0120045601b102000400d502000000d502000002d90200d9020000040820b10200dd020c5070616c6c65745f70726f6a6563745f746f6b656e14747970657328596561726c795261746500000400b902011c5065726d696c6c0000e1020c5070616c6c65745f70726f6a6563745f746f6b656e147479706573245472616e736665727308204d656d626572496401e5021c5061796d656e7401e902000400f902016c42547265654d61703c4d656d62657249642c205061796d656e743e0000e5020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065732456616c69646174656404204d656d626572496401200108204578697374696e6704002001204d656d62657249640000002c4e6f6e4578697374696e6704002001204d656d626572496400010000e9020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065734056616c6964617465645061796d656e7404485061796d656e745769746856657374696e6701ed020008011c7061796d656e74ed0201485061796d656e745769746856657374696e6700016476657374696e675f636c65616e75705f63616e646964617465f10201544f7074696f6e3c56657374696e67536f757263653e0000ed020c5070616c6c65745f70726f6a6563745f746f6b656e147479706573485061796d656e745769746856657374696e67081c42616c616e636501185456657374696e675363686564756c65506172616d7301b50200080118616d6f756e7418011c42616c616e636500014076657374696e675f7363686564756c65bd0201744f7074696f6e3c56657374696e675363686564756c65506172616d733e0000f10204184f7074696f6e04045401f5020108104e6f6e6500000010536f6d650400f5020000010000f5020c5070616c6c65745f70726f6a6563745f746f6b656e1474797065733456657374696e67536f7572636500010c3c496e697469616c49737375616e63650000001053616c65040010012c546f6b656e53616c654964000100384973737565725472616e73666572040020010c75363400020000f902042042547265654d617008044b01e502045601e902000400fd02000000fd02000002010300010300000408e502e9020005030c5070616c6c65745f70726f6a6563745f746f6b656e14747970657324546f6b656e53616c6518284a6f7942616c616e636501181c42616c616e636501182c426c6f636b4e756d62657201105456657374696e675363686564756c65506172616d7301b502204d656d62657249640120244163636f756e744964010000280128756e69745f70726963651801284a6f7942616c616e63650001347175616e746974795f6c65667418011c42616c616e636500013c66756e64735f636f6c6c65637465641801284a6f7942616c616e6365000134746f6b656e735f736f757263652001204d656d62657249640001506561726e696e67735f64657374696e6174696f6ee801444f7074696f6e3c4163636f756e7449643e00012c73746172745f626c6f636b10012c426c6f636b4e756d6265720001206475726174696f6e10012c426c6f636b4e756d62657200015c76657374696e675f7363686564756c655f706172616d73bd0201744f7074696f6e3c56657374696e675363686564756c65506172616d733e0001386361705f7065725f6d656d6265723101013c4f7074696f6e3c42616c616e63653e0001346175746f5f66696e616c697a65880110626f6f6c000009030c3473705f61726974686d65746963287065725f7468696e67732c5065727175696e74696c6c0000040020010c75363400000d03085c70616c6c65745f70726f706f73616c735f656e67696e65205261774576656e740c2850726f706f73616c49640110204d656d626572496401202c426c6f636b4e756d626572011001185450726f706f73616c53746174757355706461746564080010012850726f706f73616c496400001103016c50726f706f73616c5374617475733c426c6f636b4e756d6265723e0000106c456d697473206f6e2070726f706f73616c206372656174696f6e2e1c506172616d733a4c2d204964206f6620612070726f706f73616c2e582d204e65772070726f706f73616c207374617475732e5050726f706f73616c4465636973696f6e4d616465080010012850726f706f73616c496400001503014050726f706f73616c4465636973696f6e000110b0456d697473206f6e2067657474696e6720612070726f706f73616c20737461747573206465636973696f6e2e1c506172616d733a4c2d204964206f6620612070726f706f73616c2e4c2d2050726f706f73616c206465636973696f6e4050726f706f73616c4578656375746564080010012850726f706f73616c496400001d03013c457865637574696f6e53746174757300021070456d697473206f6e2070726f706f73616c20657865637574696f6e2e1c506172616d733a6c2d204964206f66206120757064617465642070726f706f73616c2e702d2050726f706f73616c20657865637574696f6e207374617475732e14566f74656410002001204d656d6265724964000010012850726f706f73616c4964000021030120566f74654b696e64000028011c5665633c75383e00031880456d697473206f6e20766f74696e6720666f72207468652070726f706f73616c1c506172616d733a7c2d20566f746572202d206d656d626572206964206f66206120766f7465722e4c2d204964206f6620612070726f706f73616c2e3c2d204b696e64206f6620766f74652e302d20526174696f6e616c652e4450726f706f73616c43616e63656c6c656408002001204d656d6265724964000010012850726f706f73616c49640004108c456d697473206f6e20612070726f706f73616c206265696e672063616e63656c6c65641c506172616d733a6c2d204d656d626572204964206f66207468652070726f706f736572502d204964206f66207468652070726f706f73616c4050726f706f73657252656d61726b65640c002001204d656d6265724964000010012850726f706f73616c4964000028011c5665633c75383e00051084456d697473206f6e2070726f706f736572206d616b696e6720612072656d61726b342d2070726f706f736572206964342d2070726f706f73616c206964242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e005c50726f706f73616c7320656e67696e65206576656e74731103105c70616c6c65745f70726f706f73616c735f656e67696e651474797065734470726f706f73616c5f73746174757365733850726f706f73616c537461747573042c426c6f636b4e756d6265720110010c184163746976650000004050656e64696e67457865637574696f6e040010012c426c6f636b4e756d6265720001006050656e64696e67436f6e737469747574696f6e616c697479000200001503105c70616c6c65745f70726f706f73616c735f656e67696e651474797065734470726f706f73616c5f73746174757365734050726f706f73616c4465636973696f6e00011c2043616e63656c65640000004443616e63656c6564427952756e74696d65000100185665746f65640002002052656a65637465640003001c536c61736865640004001c4578706972656400050020417070726f766564040019030160417070726f76656450726f706f73616c4465636973696f6e000600001903105c70616c6c65745f70726f706f73616c735f656e67696e651474797065734470726f706f73616c5f737461747573657360417070726f76656450726f706f73616c4465636973696f6e0001084050656e64696e67457865637574696f6e0000006050656e64696e67436f6e737469747574696f6e616c697479000100001d03105c70616c6c65745f70726f706f73616c735f656e67696e651474797065734470726f706f73616c5f73746174757365733c457865637574696f6e5374617475730001082045786563757465640000003c457865637574696f6e4661696c65640401146572726f7228011c5665633c75383e0001000021030c5c70616c6c65745f70726f706f73616c735f656e67696e6514747970657320566f74654b696e640001101c417070726f76650000001852656a65637400010014536c6173680002001c4162737461696e000300002503086c70616c6c65745f70726f706f73616c735f64697363757373696f6e205261774576656e740c2054687265616449640120204d656d6265724964012018506f737449640120011434546872656164437265617465640800200120546872656164496400002001204d656d626572496400000464456d697473206f6e20746872656164206372656174696f6e2e2c506f7374437265617465641400200118506f7374496400002001204d656d626572496400002001205468726561644964000028011c5665633c75383e0000880110626f6f6c0001045c456d697473206f6e20706f7374206372656174696f6e2e2c506f7374557064617465641000200118506f7374496400002001204d656d626572496400002001205468726561644964000028011c5665633c75383e00020454456d697473206f6e20706f7374207570646174652e445468726561644d6f64654368616e6765640c0020012054687265616449640000290301785468726561644d6f64653c42547265655365743c4d656d62657249643e3e00002001204d656d626572496400030470456d697473206f6e20746872656164206d6f6465206368616e67652e2c506f737444656c6574656410002001204d656d6265724964000020012054687265616449640000200118506f737449640000880110626f6f6c00040454456d697473206f6e20706f73742064656c657465640c5c4576656e747320666f722074686973206d6f64756c652e005c50726f706f73616c7320656e67696e65206576656e747329030c6c70616c6c65745f70726f706f73616c735f64697363757373696f6e147479706573285468726561644d6f6465043c54687265616457686974656c697374014d010108104f70656e00000018436c6f73656404004d01013c54687265616457686974656c697374000100002d03085870616c6c65745f70726f706f73616c735f636f646578205261774576656e74106447656e6572616c50726f706f73616c506172616d65746572730131034450726f706f73616c44657461696c734f660135032850726f706f73616c49640110205468726561644964012001043c50726f706f73616c43726561746564100010012850726f706f73616c496400003103016447656e6572616c50726f706f73616c506172616d657465727300003503014450726f706f73616c44657461696c734f660000200120546872656164496400001858412070726f706f73616c2077617320637265617465641c506172616d733afc2d204964206f662061206e65776c7920637265617465642070726f706f73616c2061667465722069742077617320736176656420696e2073746f726167652e01012d2047656e6572616c2070726f706f73616c20706172616d657465722e20506172616d65746572732073686172656420627920616c6c2070726f706f73616c7349012d2050726f706f73616c2044657461696c732e20506172616d65746572206f662070726f706f73616c207769746820612076617269616e7420666f722065616368206b696e64206f662070726f706f73616c9c2d204964206f662061206e65776c7920637265617465642070726f706f73616c20746872656164085c4576656e747320666f722074686973206d6f64756c652e0031030c5870616c6c65745f70726f706f73616c735f636f6465781474797065735447656e6572616c50726f706f73616c506172616d730c204d656d62657249640120244163636f756e74496401002c426c6f636b4e756d6265720110001401246d656d6265725f69642001204d656d62657249640001147469746c6528011c5665633c75383e00012c6465736372697074696f6e28011c5665633c75383e0001487374616b696e675f6163636f756e745f6964e801444f7074696f6e3c4163636f756e7449643e00015465786163745f657865637574696f6e5f626c6f636be501014c4f7074696f6e3c426c6f636b4e756d6265723e000035030c5870616c6c65745f70726f706f73616c735f636f6465781474797065733c50726f706f73616c44657461696c731c1c42616c616e636501182c426c6f636b4e756d6265720110244163636f756e744964010020576f726b657249640120244f70656e696e67496401202850726f706f73616c49640110785570646174654368616e6e656c5061796f757473506172616d6574657273015502015c185369676e616c040028011c5665633c75383e0000003852756e74696d6555706772616465040028011c5665633c75383e0001003846756e64696e67526571756573740400390301c45665633c46756e64696e6752657175657374506172616d65746572733c42616c616e63652c204163636f756e7449643e3e000200505365744d617856616c696461746f72436f756e74040010010c75333200030074437265617465576f726b696e6747726f75704c6561644f70656e696e670400410301b44372656174654f70656e696e67506172616d65746572733c426c6f636b4e756d6265722c2042616c616e63653e0004006c46696c6c576f726b696e6747726f75704c6561644f70656e696e6704004903015446696c6c4f70656e696e67506172616d657465727300050060557064617465576f726b696e6747726f75704275646765740c0018011c42616c616e636500007d010130576f726b696e6747726f757000008101012c42616c616e63654b696e64000600744465637265617365576f726b696e6747726f75704c6561645374616b650c00200120576f726b65724964000018011c42616c616e636500007d010130576f726b696e6747726f757000070054536c617368576f726b696e6747726f75704c6561640c00200120576f726b65724964000018011c42616c616e636500007d010130576f726b696e6747726f757000080064536574576f726b696e6747726f75704c6561645265776172640c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00007d010130576f726b696e6747726f7570000900645465726d696e617465576f726b696e6747726f75704c65616404004d0301a85465726d696e617465526f6c65506172616d65746572733c576f726b657249642c2042616c616e63653e000a0044416d656e64436f6e737469747574696f6e040028011c5665633c75383e000b007443616e63656c576f726b696e6747726f75704c6561644f70656e696e6708002001244f70656e696e67496400007d010130576f726b696e6747726f7570000c00485365744d656d626572736869705072696365040018011c42616c616e6365000d0064536574436f756e63696c427564676574496e6372656d656e74040018011c42616c616e6365000e0048536574436f756e63696c6f72526577617264040018011c42616c616e6365000f006c536574496e697469616c496e7669746174696f6e42616c616e6365040018011c42616c616e636500100064536574496e697469616c496e7669746174696f6e436f756e74040010010c753332001100805365744d656d626572736869704c656164496e7669746174696f6e51756f7461040010010c75333200120038536574526566657272616c43757404000801087538001300305665746f50726f706f73616c040010012850726f706f73616c496400140050557064617465476c6f62616c4e66744c696d697408006d0201384e66744c696d6974506572696f64000020010c753634001500505570646174654368616e6e656c5061796f7574730400550201785570646174654368616e6e656c5061796f757473506172616d65746572730016000039030000023d03003d03083470616c6c65745f636f6d6d6f6e6046756e64696e6752657175657374506172616d6574657273081c42616c616e63650118244163636f756e74496401000008011c6163636f756e740001244163636f756e744964000118616d6f756e7418011c42616c616e6365000041030c5870616c6c65745f70726f706f73616c735f636f6465781474797065735c4372656174654f70656e696e67506172616d6574657273082c426c6f636b4e756d62657201101c42616c616e636501180010012c6465736372697074696f6e28011c5665633c75383e0001307374616b655f706f6c696379450301845374616b65506f6c6963793c426c6f636b4e756d6265722c2042616c616e63653e0001407265776172645f7065725f626c6f636b3101013c4f7074696f6e3c42616c616e63653e00011467726f75707d010130576f726b696e6747726f7570000045030c5070616c6c65745f776f726b696e675f67726f75701474797065732c5374616b65506f6c696379082c426c6f636b4e756d62657201101c42616c616e63650118000801307374616b655f616d6f756e7418011c42616c616e63650001606c656176696e675f756e7374616b696e675f706572696f6410012c426c6f636b4e756d626572000049030c5870616c6c65745f70726f706f73616c735f636f6465781474797065735446696c6c4f70656e696e67506172616d657465727300000c01286f70656e696e675f6964200160776f726b696e675f67726f75703a3a4f70656e696e6749640001386170706c69636174696f6e5f6964200170776f726b696e675f67726f75703a3a4170706c69636174696f6e4964000134776f726b696e675f67726f75707d010130576f726b696e6747726f757000004d030c5870616c6c65745f70726f706f73616c735f636f6465781474797065735c5465726d696e617465526f6c65506172616d65746572730820576f726b6572496401201c42616c616e63650118000c0124776f726b65725f6964200120576f726b6572496400013c736c617368696e675f616d6f756e743101013c4f7074696f6e3c42616c616e63653e00011467726f75707d010130576f726b696e6747726f757000005103085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d62657249640120104861736801240449016d030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74735503042042547265654d617008044b012004560120000400590300000059030000025d03005d030000040820200061030c5070616c6c65745f776f726b696e675f67726f75701474797065732c4f70656e696e6754797065000108184c65616465720000001c526567756c61720001000065030c5070616c6c65745f776f726b696e675f67726f7570147479706573504170706c794f6e4f70656e696e67506172616d7310204d656d62657249640120244f70656e696e6749640120244163636f756e74496401001c42616c616e63650118001801246d656d6265725f69642001204d656d62657249640001286f70656e696e675f69642001244f70656e696e67496400013c726f6c655f6163636f756e745f69640001244163636f756e7449640001447265776172645f6163636f756e745f69640001244163636f756e74496400012c6465736372697074696f6e28011c5665633c75383e0001407374616b655f706172616d65746572736903018c5374616b65506172616d65746572733c4163636f756e7449642c2042616c616e63653e000069030c5070616c6c65745f776f726b696e675f67726f75701474797065733c5374616b65506172616d657465727308244163636f756e74496401001c42616c616e63650118000801147374616b6518011c42616c616e63650001487374616b696e675f6163636f756e745f69640001244163636f756e74496400006d03085070616c6c65745f776f726b696e675f67726f757024496e7374616e6365310000000071030c5070616c6c65745f776f726b696e675f67726f7570147479706573445265776172645061796d656e7454797065000108304d697373656452657761726400000034526567756c6172526577617264000100007503085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d626572496401201048617368012404490179030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74737903085070616c6c65745f776f726b696e675f67726f757024496e7374616e636532000000007d03085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d626572496401201048617368012404490181030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74738103085070616c6c65745f776f726b696e675f67726f757024496e7374616e636533000000008503085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d626572496401201048617368012404490189030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74738903085070616c6c65745f776f726b696e675f67726f757024496e7374616e636534000000008d03085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d626572496401201048617368012404490191030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74739103085070616c6c65745f776f726b696e675f67726f757024496e7374616e636535000000009503085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d626572496401201048617368012404490199030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e74739903085070616c6c65745f776f726b696e675f67726f757024496e7374616e636536000000009d03085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d6265724964012010486173680124044901a1030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e7473a103085070616c6c65745f776f726b696e675f67726f757024496e7374616e63653700000000a503085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d6265724964012010486173680124044901a9030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e7473a903085070616c6c65745f776f726b696e675f67726f757024496e7374616e63653800000000ad03085070616c6c65745f776f726b696e675f67726f7570205261774576656e7430244f70656e696e6749640120344170706c69636174696f6e49640120684170706c69636174696f6e4964546f576f726b657249644d617001550320576f726b657249640120244163636f756e74496401001c42616c616e636501182c4f70656e696e67547970650161032c5374616b65506f6c696379014503604170706c794f6e4f70656e696e67506172616d6574657273016503204d656d6265724964012010486173680124044901b1030164304f70656e696e67416464656414002001244f70656e696e674964000028011c5665633c75383e00006103012c4f70656e696e675479706500004503012c5374616b65506f6c69637900003101013c4f7074696f6e3c42616c616e63653e00001c80456d697473206f6e20616464696e67206e6577206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e67206964342d204465736372697074696f6e782d204f70656e696e672054797065284c656164206f7220576f726b657229782d205374616b6520506f6c69637920666f7220746865206f70656e696e67482d205265776172642070657220626c6f636b404170706c6965644f6e4f70656e696e670800650301604170706c794f6e4f70656e696e67506172616d657465727300002001344170706c69636174696f6e4964000110dc456d697473206f6e20616464696e6720746865206170706c69636174696f6e20666f722074686520776f726b6572206f70656e696e672e1c506172616d733a542d204f70656e696e6720706172616d657465726573402d204170706c69636174696f6e206964344f70656e696e6746696c6c65640c002001244f70656e696e6749640000550301684170706c69636174696f6e4964546f576f726b657249644d617000004d01015c42547265655365743c4170706c69636174696f6e49643e00021484456d697473206f6e2066696c6c696e6720746865206a6f62206f70656e696e672e1c506172616d733a4c2d20576f726b6572206f70656e696e67206964cc2d20576f726b6572206170706c69636174696f6e20696420746f2074686520776f726b65722069642064696374696f6e617279ac2d204170706c69636174696f6e6420696473207573656420746f2066696c6c20746865206f70656e696e67244c65616465725365740400200120576f726b6572496400030c88456d697473206f6e2073657474696e67207468652067726f7570206c65616465722e1c506172616d733a482d2047726f757020776f726b65722069642e60576f726b6572526f6c654163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964000410c4456d697473206f6e207570646174696e672074686520726f6c65206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e802d20526f6c65206163636f756e74206964206f662074686520776f726b65722e2c4c6561646572556e7365740005047c456d697473206f6e20756e2d73657474696e6720746865206c65616465722e30576f726b65724578697465640400200120576f726b6572496400061070456d697473206f6e2065786974696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e302d20526174696f6e616c652e50576f726b6572537461727465644c656176696e670800200120576f726b6572496400001d01013c4f7074696f6e3c5665633c75383e3e000710b4456d697473207768656e20776f726b65722073746172746564206c656176696e6720746865697220726f6c652e1c506172616d733a302d20576f726b65722069642e302d20526174696f6e616c652e405465726d696e61746564576f726b65720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00081480456d697473206f6e207465726d696e6174696e672074686520776f726b65722e1c506172616d733a302d20776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e405465726d696e617465644c65616465720c00200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00001d01013c4f7074696f6e3c5665633c75383e3e00091480456d697473206f6e207465726d696e6174696e6720746865206c65616465722e1c506172616d733a4c2d206c656164657220776f726b65722069642e282d2050656e616c74792e302d20526174696f6e616c652e305374616b65536c61736865641000200120576f726b65724964000018011c42616c616e6365000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e000a18c0456d697473206f6e20736c617368696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e642d2061637475616c20736c61736865642062616c616e63652e702d2052657175657374656420736c61736865642062616c616e63652e302d20526174696f6e616c652e385374616b654465637265617365640800200120576f726b65724964000018011c42616c616e6365000b10c8456d697473206f6e2064656372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74385374616b65496e637265617365640800200120576f726b65724964000018011c42616c616e6365000c10c8456d697473206f6e20696e6372656173696e672074686520726567756c617220776f726b65722f6c656164207374616b652e1c506172616d733a642d20726567756c617220776f726b65722f6c6561642069642e502d207374616b652064656c746120616d6f756e74504170706c69636174696f6e57697468647261776e04002001344170706c69636174696f6e4964000d0c2501456d697473206f6e207769746864726177696e6720746865206170706c69636174696f6e20666f722074686520726567756c617220776f726b65722f6c656164206f70656e696e672e1c506172616d733a502d204a6f62206170706c69636174696f6e2069643c4f70656e696e6743616e63656c656404002001244f70656e696e674964000e0c8c456d697473206f6e2063616e63656c696e6720746865206a6f62206f70656e696e672e1c506172616d733a302d204f70656e696e6720696424427564676574536574040018011c42616c616e6365000f0cc8456d697473206f6e2073657474696e67207468652062756467657420666f722074686520776f726b696e672067726f75702e1c506172616d733a302d206e65772062756467657468576f726b65725265776172644163636f756e74557064617465640800200120576f726b6572496400000001244163636f756e744964001010cc456d697473206f6e207570646174696e672074686520726577617264206163636f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e882d20526577617264206163636f756e74206964206f662074686520776f726b65722e64576f726b6572526577617264416d6f756e74557064617465640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e001110c8456d697473206f6e207570646174696e67207468652072657761726420616d6f756e74206f662074686520776f726b65722e1c506172616d733a4c2d204964206f662074686520776f726b65722e482d205265776172642070657220626c6f636b44537461747573546578744368616e67656408002401104861736800001d01013c4f7074696f6e3c5665633c75383e3e001210dc456d697473206f6e207570646174696e6720746865207374617475732074657874206f662074686520776f726b696e672067726f75702e1c506172616d733a482d2073746174757320746578742068617368342d207374617475732074657874384275646765745370656e64696e670c000001244163636f756e744964000018011c42616c616e636500001d01013c4f7074696f6e3c5665633c75383e3e001314c8456d697473206f6e206275646765742066726f6d2074686520776f726b696e672067726f7570206265696e67207370656e741c506172616d733a582d205265636569766572204163636f756e742049642e402d2042616c616e6365207370656e742e302d20526174696f6e616c652e28526577617264506169641000200120576f726b6572496400000001244163636f756e744964000018011c42616c616e63650000710301445265776172645061796d656e74547970650014186c456d697473206f6e20706179696e6720746865207265776172642e1c506172616d733a4c2d204964206f662074686520776f726b65722e582d205265636569766572204163636f756e742049642e202d20526577617264b42d205061796d656e74207479706520286d697373656420726577617264206f7220726567756c6172206f6e65296c4e65774d69737365645265776172644c6576656c526561636865640800200120576f726b6572496400003101013c4f7074696f6e3c42616c616e63653e00151090456d697473206f6e207265616368696e67206e6577206d6973736564207265776172642e1c506172616d733a302d20576f726b65722049442ee82d204d69737365642072657761726420286f7074696f6e616c292e204e6f6e65206d65616e7320276e6f206d697373656420726577617264272e60576f726b696e6747726f757042756467657446756e6465640c002001204d656d6265724964000018011c42616c616e6365000028011c5665633c75383e0016147846756e642074686520776f726b696e672067726f7570206275646765742e1c506172616d733a2c2d204d656d6265722049444c2d20416d6f756e74206f662062616c616e63652c2d20526174696f6e616c65304c65616452656d61726b6564040028011c5665633c75383e00170c94456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a242d206d65737361676538576f726b657252656d61726b65640800200120576f726b65724964000028011c5665633c75383e00181094456d697473206f6e204c656164206d616b696e6720612072656d61726b206d6573736167651c506172616d733a202d20776f726b6572242d206d6573736167650c5c4576656e747320666f722074686973206d6f64756c652e00385f47726f75705f206576656e7473b103085070616c6c65745f776f726b696e675f67726f757024496e7374616e63653900000000b50308306672616d655f73797374656d14506861736500010c384170706c7945787472696e736963040010010c7533320000003046696e616c697a6174696f6e00010038496e697469616c697a6174696f6e00020000b9030000022400bd03000002c10300c10300000408101000c50308306672616d655f73797374656d584c61737452756e74696d6555706772616465496e666f0000080130737065635f76657273696f6ec903014c636f6465633a3a436f6d706163743c7533323e000124737065635f6e616d65cd03016473705f72756e74696d653a3a52756e74696d65537472696e670000c9030000061000cd030000050200d1030c306672616d655f73797374656d1870616c6c65741043616c6c0404540001242866696c6c5f626c6f636b040114726174696f9c011c50657262696c6c00000405014120646973706174636820746861742077696c6c2066696c6c2074686520626c6f636b2077656967687420757020746f2074686520676976656e20726174696f2e1872656d61726b04011872656d61726b28011c5665633c75383e000114684d616b6520736f6d65206f6e2d636861696e2072656d61726b2e002823203c7765696768743e202d20604f283129602c23203c2f7765696768743e387365745f686561705f7061676573040114706167657320010c753634000204f853657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e207365745f636f6465040110636f646528011c5665633c75383e0003306453657420746865206e65772072756e74696d6520636f64652e002823203c7765696768743e31012d20604f2843202b2053296020776865726520604360206c656e677468206f662060636f64656020616e642060536020636f6d706c6578697479206f66206063616e5f7365745f636f64656045012d20312063616c6c20746f206063616e5f7365745f636f6465603a20604f28532960202863616c6c73206073705f696f3a3a6d6973633a3a72756e74696d655f76657273696f6e60207768696368206973342020657870656e73697665292e842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e4d0154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652c206275742067656e6572616c6c7920746869732069732076657279b8657870656e736976652e2057652077696c6c207472656174207468697320617320612066756c6c20626c6f636b2e2c23203c2f7765696768743e5c7365745f636f64655f776974686f75745f636865636b73040110636f646528011c5665633c75383e000424190153657420746865206e65772072756e74696d6520636f646520776974686f757420646f696e6720616e7920636865636b73206f662074686520676976656e2060636f6465602e002823203c7765696768743e8c2d20604f2843296020776865726520604360206c656e677468206f662060636f646560842d20312073746f726167652077726974652028636f64656320604f28432960292e402d203120646967657374206974656d2e282d2031206576656e742e550154686520776569676874206f6620746869732066756e6374696f6e20697320646570656e64656e74206f6e207468652072756e74696d652e2057652077696c6c207472656174207468697320617320612066756c6c48626c6f636b2e2023203c2f7765696768743e2c7365745f73746f726167650401146974656d73d50301345665633c4b657956616c75653e0005046853657420736f6d65206974656d73206f662073746f726167652e306b696c6c5f73746f726167650401106b6579738d0201205665633c4b65793e000604744b696c6c20736f6d65206974656d732066726f6d2073746f726167652e2c6b696c6c5f70726566697808011870726566697828010c4b657900011c7375626b65797310010c75333200071011014b696c6c20616c6c2073746f72616765206974656d7320776974682061206b657920746861742073746172747320776974682074686520676976656e207072656669782e0039012a2a4e4f54453a2a2a2057652072656c79206f6e2074686520526f6f74206f726967696e20746f2070726f7669646520757320746865206e756d626572206f66207375626b65797320756e6465723d0174686520707265666978207765206172652072656d6f76696e6720746f2061636375726174656c792063616c63756c6174652074686520776569676874206f6620746869732066756e6374696f6e2e4472656d61726b5f776974685f6576656e7404011872656d61726b28011c5665633c75383e000804a44d616b6520736f6d65206f6e2d636861696e2072656d61726b20616e6420656d6974206576656e742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed503000002d90300d90300000408282800dd030c306672616d655f73797374656d186c696d69747330426c6f636b5765696768747300000c0128626173655f626c6f636b2001185765696768740001246d61785f626c6f636b2001185765696768740001247065725f636c617373e10301845065724469737061746368436c6173733c57656967687473506572436c6173733e0000e1030c346672616d655f737570706f72741c77656967687473405065724469737061746368436c61737304045401e503000c01186e6f726d616ce50301045400012c6f7065726174696f6e616ce5030104540001246d616e6461746f7279e5030104540000e5030c306672616d655f73797374656d186c696d6974733c57656967687473506572436c6173730000100138626173655f65787472696e7369632001185765696768740001346d61785f65787472696e736963210101384f7074696f6e3c5765696768743e0001246d61785f746f74616c210101384f7074696f6e3c5765696768743e0001207265736572766564210101384f7074696f6e3c5765696768743e0000e9030c306672616d655f73797374656d186c696d6974732c426c6f636b4c656e677468000004010c6d6178ed0301545065724469737061746368436c6173733c7533323e0000ed030c346672616d655f737570706f72741c77656967687473405065724469737061746368436c6173730404540110000c01186e6f726d616c1001045400012c6f7065726174696f6e616c100104540001246d616e6461746f7279100104540000f1030c346672616d655f737570706f72741c776569676874733c52756e74696d65446257656967687400000801107265616420011857656967687400011477726974652001185765696768740000f503082873705f76657273696f6e3852756e74696d6556657273696f6e0000200124737065635f6e616d65cd03013452756e74696d65537472696e67000124696d706c5f6e616d65cd03013452756e74696d65537472696e67000144617574686f72696e675f76657273696f6e10010c753332000130737065635f76657273696f6e10010c753332000130696d706c5f76657273696f6e10010c75333200011061706973f903011c4170697356656300014c7472616e73616374696f6e5f76657273696f6e10010c75333200013473746174655f76657273696f6e08010875380000f903040c436f7704045401fd03000400fd03000000fd03000002010400010400000408050410000504000003080000000800090400000504000d040c306672616d655f73797374656d1870616c6c6574144572726f720404540001183c496e76616c6964537065634e616d650000081101546865206e616d65206f662073706563696669636174696f6e20646f6573206e6f74206d61746368206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e685370656356657273696f6e4e65656473546f496e63726561736500010841015468652073706563696669636174696f6e2076657273696f6e206973206e6f7420616c6c6f77656420746f206465637265617365206265747765656e207468652063757272656e742072756e74696d6550616e6420746865206e65772072756e74696d652e744661696c6564546f4578747261637452756e74696d6556657273696f6e00020cec4661696c656420746f2065787472616374207468652072756e74696d652076657273696f6e2066726f6d20746865206e65772072756e74696d652e0009014569746865722063616c6c696e672060436f72655f76657273696f6e60206f72206465636f64696e67206052756e74696d6556657273696f6e60206661696c65642e4c4e6f6e44656661756c74436f6d706f73697465000304fc537569636964652063616c6c6564207768656e20746865206163636f756e7420686173206e6f6e2d64656661756c7420636f6d706f7369746520646174612e3c4e6f6e5a65726f526566436f756e74000404350154686572652069732061206e6f6e2d7a65726f207265666572656e636520636f756e742070726576656e74696e6720746865206163636f756e742066726f6d206265696e67207075726765642e3043616c6c46696c7465726564000504d0546865206f726967696e2066696c7465722070726576656e74207468652063616c6c20746f20626520646973706174636865642e046c4572726f7220666f72207468652053797374656d2070616c6c657411040c3870616c6c65745f7574696c6974791870616c6c65741043616c6c04045400011414626174636804011463616c6c73150401605665633c3c5420617320436f6e6669673e3a3a43616c6c3e00004c7c53656e642061206261746368206f662064697370617463682063616c6c732e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e005501546869732077696c6c2072657475726e20604f6b6020696e20616c6c2063697263756d7374616e6365732e20546f2064657465726d696e65207468652073756363657373206f66207468652062617463682c20616e31016576656e74206973206465706f73697465642e20496620612063616c6c206661696c656420616e64207468652062617463682077617320696e7465727275707465642c207468656e207468655501604261746368496e74657272757074656460206576656e74206973206465706f73697465642c20616c6f6e67207769746820746865206e756d626572206f66207375636365737366756c2063616c6c73206d6164654d01616e6420746865206572726f72206f6620746865206661696c65642063616c6c2e20496620616c6c2077657265207375636365737366756c2c207468656e2074686520604261746368436f6d706c65746564604c6576656e74206973206465706f73697465642e3461735f64657269766174697665080114696e6465780904010c75313600011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000134dc53656e6420612063616c6c207468726f75676820616e20696e64657865642070736575646f6e796d206f66207468652073656e6465722e00550146696c7465722066726f6d206f726967696e206172652070617373656420616c6f6e672e205468652063616c6c2077696c6c2062652064697370617463686564207769746820616e206f726967696e207768696368bc757365207468652073616d652066696c74657220617320746865206f726967696e206f6620746869732063616c6c2e0045014e4f54453a20496620796f75206e65656420746f20656e73757265207468617420616e79206163636f756e742d62617365642066696c746572696e67206973206e6f7420686f6e6f7265642028692e652e61016265636175736520796f7520657870656374206070726f78796020746f2068617665206265656e2075736564207072696f7220696e207468652063616c6c20737461636b20616e6420796f7520646f206e6f742077616e7451017468652063616c6c207265737472696374696f6e7320746f206170706c7920746f20616e79207375622d6163636f756e7473292c207468656e20757365206061735f6d756c74695f7468726573686f6c645f31607c696e20746865204d756c74697369672070616c6c657420696e73746561642e00f44e4f54453a205072696f7220746f2076657273696f6e202a31322c2074686973207761732063616c6c6564206061735f6c696d697465645f737562602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2462617463685f616c6c04011463616c6c73150401605665633c3c5420617320436f6e6669673e3a3a43616c6c3e000238ec53656e642061206261746368206f662064697370617463682063616c6c7320616e642061746f6d6963616c6c792065786563757465207468656d2e21015468652077686f6c65207472616e73616374696f6e2077696c6c20726f6c6c6261636b20616e64206661696c20696620616e79206f66207468652063616c6c73206661696c65642e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e2c64697370617463685f617308012461735f6f726967696e8d060154426f783c543a3a50616c6c6574734f726967696e3e00011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000328c84469737061746368657320612066756e6374696f6e2063616c6c207769746820612070726f7669646564206f726967696e2e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292e1d012d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b20543a3a576569676874496e666f3a3a64697370617463685f617328292e2c23203c2f7765696768743e2c666f7263655f626174636804011463616c6c73150401605665633c3c5420617320436f6e6669673e3a3a43616c6c3e0004387c53656e642061206261746368206f662064697370617463682063616c6c732ed4556e6c696b6520606261746368602c20697420616c6c6f7773206572726f727320616e6420776f6e277420696e746572727570742e00784d61792062652063616c6c65642066726f6d20616e79206f726967696e2e005d012d206063616c6c73603a205468652063616c6c7320746f20626520646973706174636865642066726f6d207468652073616d65206f726967696e2e20546865206e756d626572206f662063616c6c206d757374206e6f74390120206578636565642074686520636f6e7374616e743a2060626174636865645f63616c6c735f6c696d6974602028617661696c61626c6520696e20636f6e7374616e74206d65746164617461292e005d014966206f726967696e20697320726f6f74207468656e2063616c6c2061726520646973706174636820776974686f757420636865636b696e67206f726967696e2066696c7465722e20285468697320696e636c75646573c8627970617373696e6720606672616d655f73797374656d3a3a436f6e6669673a3a4261736543616c6c46696c74657260292e002823203c7765696768743e01012d20436f6d706c65786974793a204f284329207768657265204320697320746865206e756d626572206f662063616c6c7320746f20626520626174636865642e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e1504000002190400190408586a6f7973747265616d5f6e6f64655f72756e74696d651043616c6c0001941853797374656d0400d10301ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53797374656d2c2052756e74696d653e0000001c5574696c6974790400110401b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5574696c6974792c2052756e74696d653e000100104261626504001d0401a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426162652c2052756e74696d653e0002002454696d657374616d700400410401b90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c54696d657374616d702c2052756e74696d653e00030028417574686f72736869700400490401bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c417574686f72736869702c2052756e74696d653e0004002042616c616e6365730400510401b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c42616c616e6365732c2052756e74696d653e00050068456c656374696f6e50726f76696465724d756c746950686173650400550401fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c456c656374696f6e50726f76696465724d756c746950686173652c2052756e74696d653e0007001c5374616b696e670400490501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5374616b696e672c2052756e74696d653e0008001c53657373696f6e04006d0501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53657373696f6e2c2052756e74696d653e0009001c4772616e6470610400790501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4772616e6470612c2052756e74696d653e000b0020496d4f6e6c696e650400a90501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c496d4f6e6c696e652c2052756e74696d653e000d00105375646f0400c90501a50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5375646f2c2052756e74696d653e00100020426167734c6973740400cd0501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426167734c6973742c2052756e74696d653e0011001c56657374696e670400d10501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c56657374696e672c2052756e74696d653e001200204d756c74697369670400d90501b50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d756c74697369672c2052756e74696d653e0013001c436f756e63696c0400e50501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f756e63696c2c2052756e74696d653e001400285265666572656e64756d0400e90501bd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c5265666572656e64756d2c2052756e74696d653e0015001c4d656d626572730400ed0501b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d656d626572732c2052756e74696d653e00160014466f72756d0400f10501a90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c466f72756d2c2052756e74696d653e00170030436f6e737469747574696f6e0400f50501c50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6e737469747574696f6e2c2052756e74696d653e00180018426f756e74790400f90501ad0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c426f756e74792c2052756e74696d653e001900404a6f7973747265616d5574696c6974790400fd0501d50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4a6f7973747265616d5574696c6974792c2052756e74696d653e001a001c436f6e74656e740400010601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6e74656e742c2052756e74696d653e001b001c53746f726167650400310601b10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53746f726167652c2052756e74696d653e001c003050726f6a656374546f6b656e0400350601c50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f6a656374546f6b656e2c2052756e74696d653e001d003c50726f706f73616c73456e67696e6504005d0601d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f706f73616c73456e67696e652c2052756e74696d653e001e004c50726f706f73616c7344697363757373696f6e0400610601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f706f73616c7344697363757373696f6e2c2052756e74696d653e001f003850726f706f73616c73436f6465780400650601cd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c50726f706f73616c73436f6465782c2052756e74696d653e00200044466f72756d576f726b696e6747726f75700400690601d90173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c466f72756d576f726b696e6747726f75702c2052756e74696d653e0021004c53746f72616765576f726b696e6747726f757004006d0601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c53746f72616765576f726b696e6747726f75702c2052756e74696d653e0022004c436f6e74656e74576f726b696e6747726f75700400710601e10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c436f6e74656e74576f726b696e6747726f75702c2052756e74696d653e0023006c4f7065726174696f6e73576f726b696e6747726f7570416c7068610400750601010273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f7065726174696f6e73576f726b696e6747726f7570416c7068612c2052756e74696d653e0024003c417070576f726b696e6747726f75700400790601d10173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c417070576f726b696e6747726f75702c2052756e74696d653e002500584d656d62657273686970576f726b696e6747726f757004007d0601ed0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4d656d62657273686970576f726b696e6747726f75702c2052756e74696d653e002600684f7065726174696f6e73576f726b696e6747726f7570426574610400810601fd0173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f7065726174696f6e73576f726b696e6747726f7570426574612c2052756e74696d653e0027006c4f7065726174696f6e73576f726b696e6747726f757047616d6d610400850601010273656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c4f7065726174696f6e73576f726b696e6747726f757047616d6d612c2052756e74696d653e00280060446973747269627574696f6e576f726b696e6747726f75700400890601f50173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a64697370617463680a3a3a43616c6c61626c6543616c6c466f723c446973747269627574696f6e576f726b696e6747726f75702c2052756e74696d653e002900001d040c2c70616c6c65745f626162651870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f6621040184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6635040140543a3a4b65794f776e657250726f6f6600001009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f6621040184426f783c45717569766f636174696f6e50726f6f663c543a3a4865616465723e3e00013c6b65795f6f776e65725f70726f6f6635040140543a3a4b65794f776e657250726f6f6600012009015265706f727420617574686f726974792065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667905017468652065717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f660d01616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63652077696c6c306265207265706f727465642e0d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e48706c616e5f636f6e6669675f6368616e6765040118636f6e666967390401504e657874436f6e66696744657363726970746f720002105d01506c616e20616e2065706f636820636f6e666967206368616e67652e205468652065706f636820636f6e666967206368616e6765206973207265636f7264656420616e642077696c6c20626520656e6163746564206f6e5101746865206e6578742063616c6c20746f2060656e6163745f65706f63685f6368616e6765602e2054686520636f6e6669672077696c6c20626520616374697661746564206f6e652065706f63682061667465722e59014d756c7469706c652063616c6c7320746f2074686973206d6574686f642077696c6c207265706c61636520616e79206578697374696e6720706c616e6e656420636f6e666967206368616e6765207468617420686164546e6f74206265656e20656e6163746564207965742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e2104084873705f636f6e73656e7375735f736c6f74734445717569766f636174696f6e50726f6f660818486561646572012504084964012d04001001206f6666656e6465722d0401084964000110736c6f7431040110536c6f7400013066697273745f686561646572250401184865616465720001347365636f6e645f6865616465722504011848656164657200002504102873705f72756e74696d651c67656e65726963186865616465721848656164657208184e756d626572011010486173680129040014012c706172656e745f68617368240130486173683a3a4f75747075740001186e756d626572c90301184e756d62657200012873746174655f726f6f74240130486173683a3a4f757470757400013c65787472696e736963735f726f6f74240130486173683a3a4f75747075740001186469676573742c0118446967657374000029040c2873705f72756e74696d65187472616974732c426c616b6554776f323536000000002d040c4473705f636f6e73656e7375735f626162650c617070185075626c696300000400c0013c737232353531393a3a5075626c696300003104084873705f636f6e73656e7375735f736c6f747310536c6f740000040020010c75363400003504082873705f73657373696f6e3c4d656d6265727368697050726f6f6600000c011c73657373696f6e10013053657373696f6e496e646578000128747269655f6e6f6465738d0201305665633c5665633c75383e3e00013c76616c696461746f725f636f756e7410013856616c696461746f72436f756e74000039040c4473705f636f6e73656e7375735f626162651c64696765737473504e657874436f6e66696744657363726970746f72000104085631080104635d030128287536342c2075363429000134616c6c6f7765645f736c6f74733d040130416c6c6f776564536c6f7473000100003d04084473705f636f6e73656e7375735f6261626530416c6c6f776564536c6f747300010c305072696d617279536c6f7473000000745072696d617279416e645365636f6e64617279506c61696e536c6f74730001006c5072696d617279416e645365636f6e64617279565246536c6f74730002000041040c4070616c6c65745f74696d657374616d701870616c6c65741043616c6c0404540001040c73657404010c6e6f7745040124543a3a4d6f6d656e7400004054536574207468652063757272656e742074696d652e005501546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6ed470686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e0041015468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627940604d696e696d756d506572696f64602e00d4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e002823203c7765696768743e31012d20604f2831296020284e6f7465207468617420696d706c656d656e746174696f6e73206f6620604f6e54696d657374616d7053657460206d75737420616c736f20626520604f283129602961012d20312073746f72616765207265616420616e6420312073746f72616765206d75746174696f6e2028636f64656320604f28312960292e202862656361757365206f6620604469645570646174653a3a74616b656020696e402020606f6e5f66696e616c697a656029d42d2031206576656e742068616e646c657220606f6e5f74696d657374616d705f736574602e204d75737420626520604f283129602e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4504000006200049040c4470616c6c65745f617574686f72736869701870616c6c65741043616c6c040454000104287365745f756e636c65730401286e65775f756e636c65734d0401385665633c543a3a4865616465723e0000046050726f76696465206120736574206f6620756e636c65732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4d0400000225040051040c3c70616c6c65745f62616c616e6365731870616c6c65741043616c6c080454000449000118207472616e736665720801106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d00128543a3a42616c616e6365000064d45472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e000501607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e11014966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74b06f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e002823203c7765696768743e61012d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f7220696e70757420636f6e66696794202074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e31012d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c6578382020636f6d7075746174696f6e2e004852656c617465642066756e6374696f6e733a004d0120202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e290120202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c206361757365cc2020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e5d0120202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c20747269676765722060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e636564602e5d0120202d20607472616e736665725f6b6565705f616c6976656020776f726b73207468652073616d652077617920617320607472616e73666572602c206275742068617320616e206164646974696f6e616c20636865636bdc202020207468617420746865207472616e736665722077696c6c206e6f74206b696c6c20746865206f726967696e206163636f756e742e842d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d11012d204f726967696e206163636f756e7420697320616c726561647920696e206d656d6f72792c20736f206e6f204442206f7065726174696f6e7320666f72207468656d2e2c23203c2f7765696768743e2c7365745f62616c616e63650c010c77686f00018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001206e65775f66726565d00128543a3a42616c616e63650001306e65775f7265736572766564d00128543a3a42616c616e636500012090536574207468652062616c616e636573206f66206120676976656e206163636f756e742e001d01546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c3101616c736f20616c7465722074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920617070726f7072696174656c792e1501496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742cfc69742077696c6c20726573657420746865206163636f756e74206e6f6e63652028606672616d655f73797374656d3a3a4163636f756e744e6f6e636560292e00b0546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e38666f7263655f7472616e736665720c0118736f7572636500018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d00128543a3a42616c616e63650002184d0145786163746c7920617320607472616e73666572602c2065786365707420746865206f726967696e206d75737420626520726f6f7420616e642074686520736f75726365206163636f756e74206d6179206265287370656369666965642e2823203c7765696768743e4d012d2053616d65206173207472616e736665722c20627574206164646974696f6e616c207265616420616e6420777269746520626563617573652074686520736f75726365206163636f756e74206973206e6f747c2020617373756d656420746f20626520696e20746865206f7665726c61792e2c23203c2f7765696768743e4c7472616e736665725f6b6565705f616c6976650801106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d00128543a3a42616c616e63650003184d0153616d6520617320746865205b607472616e73666572605d2063616c6c2c206275742077697468206120636865636b207468617420746865207472616e736665722077696c6c206e6f74206b696c6c207468653c6f726967696e206163636f756e742e00b8393925206f66207468652074696d6520796f752077616e74205b607472616e73666572605d20696e73746561642e00c05b607472616e73666572605d3a207374727563742e50616c6c65742e68746d6c236d6574686f642e7472616e73666572307472616e736665725f616c6c0801106465737400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001286b6565705f616c697665880110626f6f6c00044405015472616e736665722074686520656e74697265207472616e7366657261626c652062616c616e63652066726f6d207468652063616c6c6572206163636f756e742e0059014e4f54453a20546869732066756e6374696f6e206f6e6c7920617474656d70747320746f207472616e73666572205f7472616e7366657261626c655f2062616c616e6365732e2054686973206d65616e7320746861746101616e79206c6f636b65642c2072657365727665642c206f72206578697374656e7469616c206465706f7369747320287768656e20606b6565705f616c6976656020697320607472756560292c2077696c6c206e6f742062655d017472616e7366657272656420627920746869732066756e6374696f6e2e20546f20656e73757265207468617420746869732066756e6374696f6e20726573756c747320696e2061206b696c6c6564206163636f756e742c4501796f75206d69676874206e65656420746f207072657061726520746865206163636f756e742062792072656d6f76696e6720616e79207265666572656e636520636f756e746572732c2073746f72616765406465706f736974732c206574632e2e2e00c0546865206469737061746368206f726967696e206f6620746869732063616c6c206d757374206265205369676e65642e00a02d206064657374603a2054686520726563697069656e74206f6620746865207472616e736665722e59012d20606b6565705f616c697665603a204120626f6f6c65616e20746f2064657465726d696e652069662074686520607472616e736665725f616c6c60206f7065726174696f6e2073686f756c642073656e6420616c6c4d0120206f66207468652066756e647320746865206163636f756e74206861732c2063617573696e67207468652073656e646572206163636f756e7420746f206265206b696c6c6564202866616c7365292c206f72590120207472616e736665722065766572797468696e6720657863657074206174206c6561737420746865206578697374656e7469616c206465706f7369742c2077686963682077696c6c2067756172616e74656520746fc820206b656570207468652073656e646572206163636f756e7420616c697665202874727565292e2023203c7765696768743e39012d204f2831292e204a757374206c696b65207472616e736665722c206275742072656164696e672074686520757365722773207472616e7366657261626c652062616c616e63652066697273742e302020233c2f7765696768743e3c666f7263655f756e7265736572766508010c77686f00018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f75726365000118616d6f756e74180128543a3a42616c616e636500050cb0556e7265736572766520736f6d652062616c616e63652066726f6d2061207573657220627920666f7263652e006c43616e206f6e6c792062652063616c6c656420627920524f4f542e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e55040c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c65741043616c6c0404540001143c7375626d69745f756e7369676e65640801307261775f736f6c7574696f6e590401b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e00011c7769746e6573732d050158536f6c7574696f6e4f72536e617073686f7453697a65000038a45375626d6974206120736f6c7574696f6e20666f722074686520756e7369676e65642070686173652e00c8546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f6e6f6e655f5f2e003d0154686973207375626d697373696f6e20697320636865636b6564206f6e2074686520666c792e204d6f72656f7665722c207468697320756e7369676e656420736f6c7574696f6e206973206f6e6c79550176616c696461746564207768656e207375626d697474656420746f2074686520706f6f6c2066726f6d20746865202a2a6c6f63616c2a2a206e6f64652e204566666563746976656c792c2074686973206d65616e735d0174686174206f6e6c79206163746976652076616c696461746f72732063616e207375626d69742074686973207472616e73616374696f6e207768656e20617574686f72696e67206120626c6f636b202873696d696c617240746f20616e20696e686572656e74292e005901546f2070726576656e7420616e7920696e636f727265637420736f6c7574696f6e2028616e642074687573207761737465642074696d652f776569676874292c2074686973207472616e73616374696f6e2077696c6c4d0170616e69632069662074686520736f6c7574696f6e207375626d6974746564206279207468652076616c696461746f7220697320696e76616c696420696e20616e79207761792c206566666563746976656c799c70757474696e6720746865697220617574686f72696e6720726577617264206174207269736b2e00e04e6f206465706f736974206f7220726577617264206973206173736f63696174656420776974682074686973207375626d697373696f6e2e6c7365745f6d696e696d756d5f756e747275737465645f73636f72650401406d617962655f6e6578745f73636f7265310501544f7074696f6e3c456c656374696f6e53636f72653e000114b05365742061206e65772076616c756520666f7220604d696e696d756d556e7472757374656453636f7265602e00d84469737061746368206f726967696e206d75737420626520616c69676e656420776974682060543a3a466f7263654f726967696e602e00f05468697320636865636b2063616e206265207475726e6564206f66662062792073657474696e67207468652076616c756520746f20604e6f6e65602e747365745f656d657267656e63795f656c656374696f6e5f726573756c74040120737570706f72747335050158537570706f7274733c543a3a4163636f756e7449643e0002205901536574206120736f6c7574696f6e20696e207468652071756575652c20746f2062652068616e646564206f757420746f2074686520636c69656e74206f6620746869732070616c6c657420696e20746865206e6578748863616c6c20746f2060456c656374696f6e50726f76696465723a3a656c656374602e004501546869732063616e206f6e6c79206265207365742062792060543a3a466f7263654f726967696e602c20616e64206f6e6c79207768656e207468652070686173652069732060456d657267656e6379602e00610154686520736f6c7574696f6e206973206e6f7420636865636b656420666f7220616e7920666561736962696c69747920616e6420697320617373756d656420746f206265207472757374776f727468792c20617320616e795101666561736962696c69747920636865636b20697473656c662063616e20696e207072696e6369706c652063617573652074686520656c656374696f6e2070726f6365737320746f206661696c202864756520746f686d656d6f72792f77656967687420636f6e73747261696e73292e187375626d69740401307261775f736f6c7574696f6e590401b0426f783c526177536f6c7574696f6e3c536f6c7574696f6e4f663c543a3a4d696e6572436f6e6669673e3e3e0003249c5375626d6974206120736f6c7574696f6e20666f7220746865207369676e65642070686173652e00d0546865206469737061746368206f726967696e20666f20746869732063616c6c206d757374206265205f5f7369676e65645f5f2e005d0154686520736f6c7574696f6e20697320706f74656e7469616c6c79207175657565642c206261736564206f6e2074686520636c61696d65642073636f726520616e642070726f6365737365642061742074686520656e64506f6620746865207369676e65642070686173652e005d0141206465706f73697420697320726573657276656420616e64207265636f7264656420666f722074686520736f6c7574696f6e2e204261736564206f6e20746865206f7574636f6d652c2074686520736f6c7574696f6e15016d696768742062652072657761726465642c20736c61736865642c206f722067657420616c6c206f7220612070617274206f6620746865206465706f736974206261636b2e4c676f7665726e616e63655f66616c6c6261636b0801406d617962655f6d61785f766f74657273e501012c4f7074696f6e3c7533323e0001446d617962655f6d61785f74617267657473e501012c4f7074696f6e3c7533323e00041080547269676765722074686520676f7665726e616e63652066616c6c6261636b2e004901546869732063616e206f6e6c792062652063616c6c6564207768656e205b6050686173653a3a456d657267656e6379605d20697320656e61626c65642c20617320616e20616c7465726e617469766520746fc063616c6c696e67205b6043616c6c3a3a7365745f656d657267656e63795f656c656374696f6e5f726573756c74605d2e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e5904089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173652c526177536f6c7574696f6e040453015d04000c0120736f6c7574696f6e5d0401045300011473636f726529050134456c656374696f6e53636f7265000114726f756e6410010c75333200005d0408586a6f7973747265616d5f6e6f64655f72756e74696d65384e706f73536f6c7574696f6e31360000400118766f74657331610400000118766f746573326d0400000118766f74657333810400000118766f746573348d0400000118766f74657335990400000118766f74657336a50400000118766f74657337b10400000118766f74657338bd0400000118766f74657339c9040000011c766f7465733130d5040000011c766f7465733131e1040000011c766f7465733132ed040000011c766f7465733133f9040000011c766f746573313405050000011c766f746573313511050000011c766f74657331361d050000006104000002650400650400000408c90369040069040000060904006d0400000271040071040000040cc9037504690400750400000408690479040079040000067d04007d040c3473705f61726974686d65746963287065725f7468696e677318506572553136000004000904010c7531360000810400000285040085040000040cc90389046904008904000003020000007504008d0400000291040091040000040cc903950469040095040000030300000075040099040000029d04009d040000040cc903a104690400a10400000304000000750400a504000002a90400a9040000040cc903ad04690400ad0400000305000000750400b104000002b50400b5040000040cc903b904690400b90400000306000000750400bd04000002c10400c1040000040cc903c504690400c50400000307000000750400c904000002cd0400cd040000040cc903d104690400d10400000308000000750400d504000002d90400d9040000040cc903dd04690400dd0400000309000000750400e104000002e50400e5040000040cc903e904690400e9040000030a000000750400ed04000002f10400f1040000040cc903f504690400f5040000030b000000750400f904000002fd0400fd040000040cc903010569040001050000030c000000750400050500000209050009050000040cc9030d056904000d050000030d000000750400110500000215050015050000040cc903190569040019050000030e0000007504001d0500000221050021050000040cc903250569040025050000030f0000007504002905084473705f6e706f735f656c656374696f6e7334456c656374696f6e53636f726500000c01346d696e696d616c5f7374616b6518013c457874656e64656442616c616e636500012473756d5f7374616b6518013c457874656e64656442616c616e636500014473756d5f7374616b655f7371756172656418013c457874656e64656442616c616e636500002d05089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736558536f6c7574696f6e4f72536e617073686f7453697a650000080118766f74657273c903010c75333200011c74617267657473c903010c7533320000310504184f7074696f6e0404540129050108104e6f6e6500000010536f6d650400290500000100003505000002390500390500000408003d05003d05084473705f6e706f735f656c656374696f6e731c537570706f727404244163636f756e744964010000080114746f74616c18013c457874656e64656442616c616e6365000118766f74657273410501845665633c284163636f756e7449642c20457874656e64656442616c616e6365293e000041050000024505004505000004080018004905103870616c6c65745f7374616b696e671870616c6c65741870616c6c65741043616c6c04045400016810626f6e640c0128636f6e74726f6c6c657200018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011476616c7565d0013042616c616e63654f663c543e00011470617965654d05017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000044610154616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c80626520746865206163636f756e74207468617420636f6e74726f6c732069742e002d016076616c756560206d757374206265206d6f7265207468616e2074686520606d696e696d756d5f62616c616e636560207370656369666965642062792060543a3a43757272656e6379602e002101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e003c456d6974732060426f6e646564602e2823203c7765696768743ed02d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e1c2d204f2831292e642d20546872656520657874726120444220656e74726965732e004d014e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e65643d01756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e482d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2c23203c2f7765696768743e28626f6e645f65787472610401386d61785f6164646974696f6e616cd0013042616c616e63654f663c543e00013c610141646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757030666f72207374616b696e672e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e004d01557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e5501556e6c696b65205b60626f6e64605d2853656c663a3a626f6e6429206f72205b60756e626f6e64605d2853656c663a3a756e626f6e642920746869732066756e6374696f6e20646f6573206e6f7420696d706f7365bc616e79206c696d69746174696f6e206f6e2074686520616d6f756e7420746861742063616e2062652061646465642e003c456d6974732060426f6e646564602e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e1c2d204f2831292e2c23203c2f7765696768743e18756e626f6e6404011476616c7565d0013042616c616e63654f663c543e00024c51015363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e64fc706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e2101543a3a43757272656e63793a3a6d696e696d756d5f62616c616e636528292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e0045014f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665bc7468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e0031014e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d6178556e6c6f636b696e674368756e6b736029390163616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e656564f8746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e00390149662061207573657220656e636f756e74657273207468652060496e73756666696369656e74426f6e6460206572726f72207768656e2063616c6c696e6720746869732065787472696e7369632c1901746865792073686f756c642063616c6c20606368696c6c6020666972737420696e206f7264657220746f206672656520757020746865697220626f6e6465642066756e64732e0044456d6974732060556e626f6e646564602e009453656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e4477697468647261775f756e626f6e6465640401486e756d5f736c617368696e675f7370616e7310010c75333200033c290152656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e0031015468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f4877686174657665722069742077616e74732e001501546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722e0048456d697473206057697468647261776e602e006853656520616c736f205b6043616c6c3a3a756e626f6e64605d2e002823203c7765696768743e0501436f6d706c6578697479204f285329207768657265205320697320746865206e756d626572206f6620736c617368696e67207370616e7320746f2072656d6f766509014e4f54453a2057656967687420616e6e6f746174696f6e20697320746865206b696c6c207363656e6172696f2c20776520726566756e64206f74686572776973652e2c23203c2f7765696768743e2076616c6964617465040114707265667394013856616c696461746f725072656673000414e44465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e206e6f6d696e61746504011c74617267657473510501a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e00052c0d014465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743e2d012d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f662060746172676574736020284e29050177686963682069732063617070656420617420436f6d7061637441737369676e6d656e74733a3a4c494d49542028543a3a4d61784e6f6d696e6174696f6e73292ed42d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e2c23203c2f7765696768743e146368696c6c00062cc44465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e502d20436f6e7461696e73206f6e6520726561642ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e2c23203c2f7765696768743e247365745f706179656504011470617965654d05017c52657761726444657374696e6174696f6e3c543a3a4163636f756e7449643e000740b42852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e242d2d2d2d2d2d2d2d2d382d205765696768743a204f283129302d204442205765696768743a48202020202d20526561643a204c656467657248202020202d2057726974653a2050617965652c23203c2f7765696768743e387365745f636f6e74726f6c6c6572040128636f6e74726f6c6c657200018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650008408c2852652d297365742074686520636f6e74726f6c6c6572206f6620612073746173682e005101456666656374732077696c6c2062652066656c7420696e7374616e746c792028617320736f6f6e20617320746869732066756e6374696f6e20697320636f6d706c65746564207375636365737366756c6c79292e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e002823203c7765696768743ee42d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e942d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732ec42d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e282d2d2d2d2d2d2d2d2d2d305765696768743a204f283129284442205765696768743af02d20526561643a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c6572f42d2057726974653a20426f6e6465642c204c6564676572204e657720436f6e74726f6c6c65722c204c6564676572204f6c6420436f6e74726f6c6c65722c23203c2f7765696768743e4c7365745f76616c696461746f725f636f756e7404010c6e6577c903010c75333200092090536574732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e305765696768743a204f2831295857726974653a2056616c696461746f7220436f756e742c23203c2f7765696768743e60696e6372656173655f76616c696461746f725f636f756e740401286164646974696f6e616cc903010c753332000a1ca8496e6372656d656e74732074686520696465616c206e756d626572206f662076616c696461746f72732e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e547363616c655f76616c696461746f725f636f756e74040118666163746f725505011c50657263656e74000b1cd05363616c652075702074686520696465616c206e756d626572206f662076616c696461746f7273206279206120666163746f722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002823203c7765696768743e9853616d65206173205b6053656c663a3a7365745f76616c696461746f725f636f756e74605d2e2c23203c2f7765696768743e34666f7263655f6e6f5f65726173000c3cac466f72636520746865726520746f206265206e6f206e6577206572617320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e3901546875732074686520656c656374696f6e2070726f63657373206d6179206265206f6e676f696e67207768656e20746869732069732063616c6c65642e20496e2074686973206361736520746865dc656c656374696f6e2077696c6c20636f6e74696e756520756e74696c20746865206e65787420657261206973207472696767657265642e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129442d2057726974653a20466f7263654572612c23203c2f7765696768743e34666f7263655f6e65775f657261000d404901466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f6620746865206e6578742073657373696f6e2e20416674657220746869732c2069742077696c6c2062659c726573657420746f206e6f726d616c20286e6f6e2d666f7263656429206265686176696f75722e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e002823203c7765696768743e3c2d204e6f20617267756d656e74732e382d205765696768743a204f283129402d20577269746520466f7263654572612c23203c2f7765696768743e447365745f696e76756c6e657261626c6573040134696e76756c6e657261626c6573510501445665633c543a3a4163636f756e7449643e000e0cc8536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e34666f7263655f756e7374616b650801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c753332000f0c0901466f72636520612063757272656e74207374616b657220746f206265636f6d6520636f6d706c6574656c7920756e7374616b65642c20696d6d6564696174656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e50666f7263655f6e65775f6572615f616c776179730010240101466f72636520746865726520746f2062652061206e6577206572612061742074686520656e64206f662073657373696f6e7320696e646566696e6974656c792e0084546865206469737061746368206f726967696e206d75737420626520526f6f742e002423205761726e696e6700190154686520656c656374696f6e2070726f6365737320737461727473206d756c7469706c6520626c6f636b73206265666f72652074686520656e64206f6620746865206572612e4901496620746869732069732063616c6c6564206a757374206265666f72652061206e657720657261206973207472696767657265642c2074686520656c656374696f6e2070726f63657373206d6179206e6f748c6861766520656e6f75676820626c6f636b7320746f20676574206120726573756c742e5463616e63656c5f64656665727265645f736c61736808010c657261100120457261496e646578000134736c6173685f696e6469636573590501205665633c7533323e0011149443616e63656c20656e6163746d656e74206f66206120646566657272656420736c6173682e00b043616e2062652063616c6c6564206279207468652060543a3a536c61736843616e63656c4f726967696e602e000101506172616d65746572733a2065726120616e6420696e6469636573206f662074686520736c617368657320666f7220746861742065726120746f206b696c6c2e387061796f75745f7374616b65727308013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400010c657261100120457261496e6465780012540d01506179206f757420616c6c20746865207374616b65727320626568696e6420612073696e676c652076616c696461746f7220666f7220612073696e676c65206572612e0049012d206076616c696461746f725f73746173686020697320746865207374617368206163636f756e74206f66207468652076616c696461746f722e205468656972206e6f6d696e61746f72732c20757020746f2501202060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602c2077696c6c20616c736f207265636569766520746865697220726577617264732e31012d206065726160206d617920626520616e7920657261206265747765656e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e005501546865206f726967696e206f6620746869732063616c6c206d757374206265205f5369676e65645f2e20416e79206163636f756e742063616e2063616c6c20746869732066756e6374696f6e2c206576656e206966746974206973206e6f74206f6e65206f6620746865207374616b6572732e002823203c7765696768743efc2d2054696d6520636f6d706c65786974793a206174206d6f7374204f284d61784e6f6d696e61746f72526577617264656450657256616c696461746f72292ec02d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e2c2d2d2d2d2d2d2d2d2d2d2d19014e20697320746865204e756d626572206f66207061796f75747320666f72207468652076616c696461746f722028696e636c7564696e67207468652076616c696461746f72291c5765696768743a842d205265776172642044657374696e6174696f6e205374616b65643a204f284e29c02d205265776172642044657374696e6174696f6e20436f6e74726f6c6c657220284372656174696e67293a204f284e29004d0120204e4f54453a20776569676874732061726520617373756d696e672074686174207061796f75747320617265206d61646520746f20616c697665207374617368206163636f756e7420285374616b6564292e55012020506179696e67206576656e2061206465616420636f6e74726f6c6c65722069732063686561706572207765696768742d776973652e20576520646f6e277420646f20616e7920726566756e647320686572652e2c23203c2f7765696768743e187265626f6e6404011476616c7565d0013042616c616e63654f663c543e001324dc5265626f6e64206120706f7274696f6e206f6620746865207374617368207363686564756c656420746f20626520756e6c6f636b65642e00d4546865206469737061746368206f726967696e206d757374206265207369676e65642062792074686520636f6e74726f6c6c65722e002823203c7765696768743ed02d2054696d6520636f6d706c65786974793a204f284c292c207768657265204c20697320756e6c6f636b696e67206368756e6b73882d20426f756e64656420627920604d6178556e6c6f636b696e674368756e6b73602ef02d2053746f72616765206368616e6765733a2043616e277420696e6372656173652073746f726167652c206f6e6c792064656372656173652069742e2c23203c2f7765696768743e447365745f686973746f72795f64657074680801446e65775f686973746f72795f6465707468c9030120457261496e6465780001446572615f6974656d735f64656c65746564c903010c7533320014582d015365742060486973746f72794465707468602076616c75652e20546869732066756e6374696f6e2077696c6c2064656c65746520616e7920686973746f727920696e666f726d6174696f6e7c7768656e2060486973746f727944657074686020697320726564756365642e002c506172616d65746572733a0d012d20606e65775f686973746f72795f6465707468603a20546865206e657720686973746f727920646570746820796f7520776f756c64206c696b6520746f207365742e59012d20606572615f6974656d735f64656c65746564603a20546865206e756d626572206f66206974656d7320746861742077696c6c2062652064656c6574656420627920746869732064697370617463682e20546869735d01202073686f756c64207265706f727420616c6c207468652073746f72616765206974656d7320746861742077696c6c2062652064656c6574656420627920636c656172696e67206f6c642065726120686973746f72792e590120204e656564656420746f207265706f727420616e2061636375726174652077656967687420666f72207468652064697370617463682e20547275737465642062792060526f6f746020746f207265706f727420616e4820206163637572617465206e756d6265722e00504f726967696e206d75737420626520726f6f742e002823203c7765696768743edc2d20453a204e756d626572206f6620686973746f7279206465707468732072656d6f7665642c20692e652e203130202d3e2037203d2033382d205765696768743a204f284529302d204442205765696768743a9c202020202d2052656164733a2043757272656e74204572612c20486973746f72792044657074686c202020202d205772697465733a20486973746f72792044657074682d01202020202d20436c6561722050726566697820456163683a20457261205374616b6572732c204572615374616b657273436c69707065642c204572617356616c696461746f7250726566732501202020202d2057726974657320456163683a204572617356616c696461746f725265776172642c2045726173526577617264506f696e74732c2045726173546f74616c5374616b652c6c20202020202045726173537461727453657373696f6e496e6465782c23203c2f7765696768743e28726561705f73746173680801147374617368000130543a3a4163636f756e7449640001486e756d5f736c617368696e675f7370616e7310010c7533320015305d0152656d6f766520616c6c2064617461207374727563747572657320636f6e6365726e696e672061207374616b65722f7374617368206f6e636520697420697320617420612073746174652077686572652069742063616e0501626520636f6e736964657265642060647573746020696e20746865207374616b696e672073797374656d2e2054686520726571756972656d656e7473206172653a000501312e207468652060746f74616c5f62616c616e636560206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e1101322e206f722c2074686520606c65646765722e746f74616c60206f66207468652073746173682069732062656c6f77206578697374656e7469616c206465706f7369742e00550154686520666f726d65722063616e2068617070656e20696e206361736573206c696b65206120736c6173683b20746865206c6174746572207768656e20612066756c6c7920756e626f6e646564206163636f756e7409016973207374696c6c20726563656976696e67207374616b696e67207265776172647320696e206052657761726444657374696e6174696f6e3a3a5374616b6564602e00310149742063616e2062652063616c6c656420627920616e796f6e652c206173206c6f6e672061732060737461736860206d65657473207468652061626f766520726571756972656d656e74732e00dc526566756e647320746865207472616e73616374696f6e20666565732075706f6e207375636365737366756c20657865637574696f6e2e106b69636b04010c77686f510501a05665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e00162ce052656d6f76652074686520676976656e206e6f6d696e6174696f6e732066726f6d207468652063616c6c696e672076616c696461746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e005101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e004d012d206077686f603a2041206c697374206f66206e6f6d696e61746f72207374617368206163636f756e74732077686f20617265206e6f6d696e6174696e6720746869732076616c696461746f72207768696368c0202073686f756c64206e6f206c6f6e676572206265206e6f6d696e6174696e6720746869732076616c696461746f722e0055014e6f74653a204d616b696e6720746869732063616c6c206f6e6c79206d616b65732073656e736520696620796f7520666972737420736574207468652076616c696461746f7220707265666572656e63657320746f78626c6f636b20616e792066757274686572206e6f6d696e6174696f6e732e4c7365745f7374616b696e675f636f6e666967731801486d696e5f6e6f6d696e61746f725f626f6e645d050158436f6e6669674f703c42616c616e63654f663c543e3e0001486d696e5f76616c696461746f725f626f6e645d050158436f6e6669674f703c42616c616e63654f663c543e3e00014c6d61785f6e6f6d696e61746f725f636f756e7461050134436f6e6669674f703c7533323e00014c6d61785f76616c696461746f725f636f756e7461050134436f6e6669674f703c7533323e00013c6368696c6c5f7468726573686f6c6465050144436f6e6669674f703c50657263656e743e0001386d696e5f636f6d6d697373696f6e69050144436f6e6669674f703c50657262696c6c3e001744ac5570646174652074686520766172696f7573207374616b696e6720636f6e66696775726174696f6e73202e0025012a20606d696e5f6e6f6d696e61746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f2062652061206e6f6d696e61746f722e25012a20606d696e5f76616c696461746f725f626f6e64603a20546865206d696e696d756d2061637469766520626f6e64206e656564656420746f20626520612076616c696461746f722e55012a20606d61785f6e6f6d696e61746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e2062652061206e6f6d696e61746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e55012a20606d61785f76616c696461746f725f636f756e74603a20546865206d6178206e756d626572206f662075736572732077686f2063616e20626520612076616c696461746f72206174206f6e63652e205768656e98202073657420746f20604e6f6e65602c206e6f206c696d697420697320656e666f726365642e59012a20606368696c6c5f7468726573686f6c64603a2054686520726174696f206f6620606d61785f6e6f6d696e61746f725f636f756e7460206f7220606d61785f76616c696461746f725f636f756e74602077686963681901202073686f756c642062652066696c6c656420696e206f7264657220666f722074686520606368696c6c5f6f7468657260207472616e73616374696f6e20746f20776f726b2e61012a20606d696e5f636f6d6d697373696f6e603a20546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e207468617420656163682076616c696461746f7273206d757374206d61696e7461696e2e550120205468697320697320636865636b6564206f6e6c792075706f6e2063616c6c696e67206076616c6964617465602e204578697374696e672076616c696461746f727320617265206e6f742061666665637465642e00a84f726967696e206d75737420626520526f6f7420746f2063616c6c20746869732066756e6374696f6e2e0035014e4f54453a204578697374696e67206e6f6d696e61746f727320616e642076616c696461746f72732077696c6c206e6f742062652061666665637465642062792074686973207570646174652e1101746f206b69636b2070656f706c6520756e64657220746865206e6577206c696d6974732c20606368696c6c5f6f74686572602073686f756c642062652063616c6c65642e2c6368696c6c5f6f74686572040128636f6e74726f6c6c6572000130543a3a4163636f756e74496400186841014465636c61726520612060636f6e74726f6c6c65726020746f2073746f702070617274696369706174696e672061732065697468657220612076616c696461746f72206f72206e6f6d696e61746f722e00d8456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e004101546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2c206275742063616e2062652063616c6c656420627920616e796f6e652e0059014966207468652063616c6c6572206973207468652073616d652061732074686520636f6e74726f6c6c6572206265696e672074617267657465642c207468656e206e6f206675727468657220636865636b7320617265d8656e666f726365642c20616e6420746869732066756e6374696f6e2062656861766573206a757374206c696b6520606368696c6c602e005d014966207468652063616c6c657220697320646966666572656e74207468616e2074686520636f6e74726f6c6c6572206265696e672074617267657465642c2074686520666f6c6c6f77696e6720636f6e646974696f6e73306d757374206265206d65743a001d012a2060636f6e74726f6c6c657260206d7573742062656c6f6e6720746f2061206e6f6d696e61746f722077686f20686173206265636f6d65206e6f6e2d6465636f6461626c652c000c4f723a003d012a204120604368696c6c5468726573686f6c6460206d7573742062652073657420616e6420636865636b656420776869636820646566696e657320686f7720636c6f736520746f20746865206d6178550120206e6f6d696e61746f7273206f722076616c696461746f7273207765206d757374207265616368206265666f72652075736572732063616e207374617274206368696c6c696e67206f6e652d616e6f746865722e59012a204120604d61784e6f6d696e61746f72436f756e746020616e6420604d617856616c696461746f72436f756e7460206d75737420626520736574207768696368206973207573656420746f2064657465726d696e65902020686f7720636c6f73652077652061726520746f20746865207468726573686f6c642e5d012a204120604d696e4e6f6d696e61746f72426f6e646020616e6420604d696e56616c696461746f72426f6e6460206d7573742062652073657420616e6420636865636b65642c2077686963682064657465726d696e65735101202069662074686973206973206120706572736f6e20746861742073686f756c64206265206368696c6c6564206265636175736520746865792068617665206e6f74206d657420746865207468726573686f6c64402020626f6e642072657175697265642e005501546869732063616e2062652068656c7066756c20696620626f6e6420726571756972656d656e74732061726520757064617465642c20616e64207765206e65656420746f2072656d6f7665206f6c642075736572739877686f20646f206e6f74207361746973667920746865736520726571756972656d656e74732e68666f7263655f6170706c795f6d696e5f636f6d6d697373696f6e04013c76616c696461746f725f7374617368000130543a3a4163636f756e74496400190c4501466f72636520612076616c696461746f7220746f2068617665206174206c6561737420746865206d696e696d756d20636f6d6d697373696f6e2e20546869732077696c6c206e6f74206166666563742061610176616c696461746f722077686f20616c726561647920686173206120636f6d6d697373696f6e2067726561746572207468616e206f7220657175616c20746f20746865206d696e696d756d2e20416e79206163636f756e743863616e2063616c6c20746869732e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e4d05083870616c6c65745f7374616b696e674452657761726444657374696e6174696f6e04244163636f756e74496401000114185374616b656400000014537461736800010028436f6e74726f6c6c65720002001c4163636f756e7404000001244163636f756e744964000300104e6f6e65000400005105000002000055050c3473705f61726974686d65746963287065725f7468696e67731c50657263656e740000040008010875380000590500000210005d05103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540118010c104e6f6f700000000c5365740400180104540001001852656d6f7665000200006105103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f700404540110010c104e6f6f700000000c5365740400100104540001001852656d6f7665000200006505103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454015505010c104e6f6f700000000c536574040055050104540001001852656d6f7665000200006905103870616c6c65745f7374616b696e671870616c6c65741870616c6c657420436f6e6669674f70040454019c010c104e6f6f700000000c53657404009c0104540001001852656d6f7665000200006d050c3870616c6c65745f73657373696f6e1870616c6c65741043616c6c040454000108207365745f6b6579730801106b6579737105011c543a3a4b65797300011470726f6f6628011c5665633c75383e000038e453657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b657973602e1d01416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722ec05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e00d0546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e002823203c7765696768743e11012d20436f6d706c65786974793a20604f283129602e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468206f6698202060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a20606f726967696e206163636f756e74602c2060543a3a56616c696461746f7249644f66602c20604e6578744b65797360a02d2044625772697465733a20606f726967696e206163636f756e74602c20604e6578744b65797360802d204462526561647320706572206b65792069643a20604b65794f776e657260842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e2870757267655f6b657973000140c852656d6f76657320616e792073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c65722e00c05468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e005501546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265205369676e656420616e6420746865206163636f756e74206d757374206265206569746865722062655d01636f6e7665727469626c6520746f20612076616c696461746f72204944207573696e672074686520636861696e2773207479706963616c2061646472657373696e672073797374656d20287468697320757375616c6c7951016d65616e73206265696e67206120636f6e74726f6c6c6572206163636f756e7429206f72206469726563746c7920636f6e7665727469626c6520696e746f20612076616c696461746f722049442028776869636894757375616c6c79206d65616e73206265696e672061207374617368206163636f756e74292e002823203c7765696768743e61012d20436f6d706c65786974793a20604f2831296020696e206e756d626572206f66206b65792074797065732e2041637475616c20636f737420646570656e6473206f6e20746865206e756d626572206f66206c656e677468a420206f662060543a3a4b6579733a3a6b65795f6964732829602077686963682069732066697865642eec2d20446252656164733a2060543a3a56616c696461746f7249644f66602c20604e6578744b657973602c20606f726967696e206163636f756e7460a02d2044625772697465733a20604e6578744b657973602c20606f726967696e206163636f756e7460842d20446257726974657320706572206b65792069643a20604b65794f776e6572602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e710508586a6f7973747265616d5f6e6f64655f72756e74696d652c53657373696f6e4b657973000010011c6772616e647061b00109013c2f2ac2ab2a2f204772616e647061202f2ac2bb2a2f206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000110626162652d0401fc3c2f2ac2ab2a2f2042616265202f2ac2bb2a2f206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c6963000124696d5f6f6e6c696e65bc010d013c2f2ac2ab2a2f20496d4f6e6c696e65202f2ac2bb2a2f206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a5075626c696300014c617574686f726974795f646973636f7665727975050139013c2f2ac2ab2a2f20417574686f72697479446973636f76657279202f2ac2bb2a2f206173202463726174653a3a426f756e64546f52756e74696d654170705075626c69633e3a3a0a5075626c6963000075050c5873705f617574686f726974795f646973636f766572790c617070185075626c696300000400c0013c737232353531393a3a5075626c6963000079050c3870616c6c65745f6772616e6470611870616c6c65741043616c6c04045400010c4c7265706f72745f65717569766f636174696f6e08014865717569766f636174696f6e5f70726f6f667d0501bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6635040140543a3a4b65794f776e657250726f6f6600001009015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e707265706f72745f65717569766f636174696f6e5f756e7369676e656408014865717569766f636174696f6e5f70726f6f667d0501bc426f783c45717569766f636174696f6e50726f6f663c543a3a486173682c20543a3a426c6f636b4e756d6265723e3e00013c6b65795f6f776e65725f70726f6f6635040140543a3a4b65794f776e657250726f6f6600012409015265706f727420766f7465722065717569766f636174696f6e2f6d69736265686176696f722e2054686973206d6574686f642077696c6c2076657269667920746865f465717569766f636174696f6e2070726f6f6620616e642076616c69646174652074686520676976656e206b6579206f776e6572736869702070726f6f66f8616761696e73742074686520657874726163746564206f6666656e6465722e20496620626f7468206172652076616c69642c20746865206f6666656e63654477696c6c206265207265706f727465642e000d01546869732065787472696e736963206d7573742062652063616c6c656420756e7369676e656420616e642069742069732065787065637465642074686174206f6e6c791501626c6f636b20617574686f72732077696c6c2063616c6c206974202876616c69646174656420696e206056616c6964617465556e7369676e656460292c2061732073756368150169662074686520626c6f636b20617574686f7220697320646566696e65642069742077696c6c20626520646566696e6564206173207468652065717569766f636174696f6e247265706f727465722e306e6f74655f7374616c6c656408011464656c6179100138543a3a426c6f636b4e756d62657200016c626573745f66696e616c697a65645f626c6f636b5f6e756d626572100138543a3a426c6f636b4e756d62657200021c19014e6f74652074686174207468652063757272656e7420617574686f7269747920736574206f6620746865204752414e4450412066696e616c697479206761646765742068617325017374616c6c65642e20546869732077696c6c2074726967676572206120666f7263656420617574686f7269747920736574206368616e67652061742074686520626567696e6e696e671d016f6620746865206e6578742073657373696f6e2c20746f20626520656e6163746564206064656c61796020626c6f636b7320616674657220746861742e205468652064656c6179110173686f756c64206265206869676820656e6f75676820746f20736166656c7920617373756d6520746861742074686520626c6f636b207369676e616c6c696e67207468652501666f72636564206368616e67652077696c6c206e6f742062652072652d6f726765642028652e672e203130303020626c6f636b73292e20546865204752414e44504120766f74657273250177696c6c20737461727420746865206e657720617574686f7269747920736574207573696e672074686520676976656e2066696e616c697a656420626c6f636b20617320626173652e584f6e6c792063616c6c61626c6520627920726f6f742e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632e7d05084c73705f66696e616c6974795f6772616e6470614445717569766f636174696f6e50726f6f660804480124044e0110000801187365745f6964200114536574496400013065717569766f636174696f6e8105014845717569766f636174696f6e3c482c204e3e00008105084c73705f66696e616c6974795f6772616e6470613045717569766f636174696f6e0804480124044e011001081c507265766f7465040085050139016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265766f74653c482c204e3e2c0a417574686f726974795369676e61747572653e00000024507265636f6d6d697404009d050141016772616e6470613a3a45717569766f636174696f6e3c417574686f7269747949642c206772616e6470613a3a507265636f6d6d69743c482c204e3e2c0a417574686f726974795369676e61747572653e000100008505084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b004560189050453018d0500100130726f756e645f6e756d62657220010c7536340001206964656e74697479b00108496400011466697273749905011828562c2053290001187365636f6e649905011828562c20532900008905084066696e616c6974795f6772616e6470611c507265766f74650804480124044e01100008012c7461726765745f68617368240104480001347461726765745f6e756d6265721001044e00008d050c4c73705f66696e616c6974795f6772616e6470610c617070245369676e61747572650000040091050148656432353531393a3a5369676e6174757265000091050c1c73705f636f72651c65643235353139245369676e617475726500000400950501205b75383b2036345d0000950500000340000000080099050000040889058d05009d05084066696e616c6974795f6772616e6470613045717569766f636174696f6e0c08496401b0045601a1050453018d0500100130726f756e645f6e756d62657220010c7536340001206964656e74697479b0010849640001146669727374a505011828562c2053290001187365636f6e64a505011828562c2053290000a105084066696e616c6974795f6772616e64706124507265636f6d6d69740804480124044e01100008012c7461726765745f68617368240104480001347461726765745f6e756d6265721001044e0000a50500000408a1058d0500a9050c4070616c6c65745f696d5f6f6e6c696e651870616c6c65741043616c6c04045400010424686561727462656174080124686561727462656174ad0501644865617274626561743c543a3a426c6f636b4e756d6265723e0001247369676e6174757265c10501bc3c543a3a417574686f7269747949642061732052756e74696d654170705075626c69633e3a3a5369676e61747572650000242823203c7765696768743e61012d20436f6d706c65786974793a20604f284b202b20452960207768657265204b206973206c656e677468206f6620604b6579736020286865617274626561742e76616c696461746f72735f6c656e2920616e642045206973d820206c656e677468206f6620606865617274626561742e6e6574776f726b5f73746174652e65787465726e616c5f61646472657373608820202d20604f284b29603a206465636f64696e67206f66206c656e67746820604b60ac20202d20604f284529603a206465636f64696e672f656e636f64696e67206f66206c656e6774682060456039012d20446252656164733a2070616c6c65745f73657373696f6e206056616c696461746f7273602c2070616c6c65745f73657373696f6e206043757272656e74496e646578602c20604b657973602c5820206052656365697665644865617274626561747360802d2044625772697465733a2060526563656976656448656172746265617473602c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ead05084070616c6c65745f696d5f6f6e6c696e6524486561727462656174042c426c6f636b4e756d626572011000140130626c6f636b5f6e756d62657210012c426c6f636b4e756d6265720001346e6574776f726b5f7374617465b10501484f70617175654e6574776f726b537461746500013473657373696f6e5f696e64657810013053657373696f6e496e64657800013c617574686f726974795f696e64657810012441757468496e64657800013876616c696461746f72735f6c656e10010c7533320000b1050c1c73705f636f7265206f6666636861696e484f70617175654e6574776f726b5374617465000008011c706565725f6964b50501304f706171756550656572496400014865787465726e616c5f616464726573736573b90501505665633c4f70617175654d756c7469616464723e0000b505081c73705f636f7265304f70617175655065657249640000040028011c5665633c75383e0000b905000002bd0500bd050c1c73705f636f7265206f6666636861696e3c4f70617175654d756c7469616464720000040028011c5665633c75383e0000c105104070616c6c65745f696d5f6f6e6c696e651c737232353531392c6170705f73723235353139245369676e617475726500000400c5050148737232353531393a3a5369676e61747572650000c5050c1c73705f636f72651c73723235353139245369676e617475726500000400950501205b75383b2036345d0000c9050c2c70616c6c65745f7375646f1870616c6c65741043616c6c040454000110107375646f04011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000028350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e547375646f5f756e636865636b65645f77656967687408011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e000118776569676874200118576569676874000128350141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e2d01546869732066756e6374696f6e20646f6573206e6f7420636865636b2074686520776569676874206f66207468652063616c6c2c20616e6420696e737465616420616c6c6f777320746865b05375646f207573657220746f20737065636966792074686520776569676874206f66207468652063616c6c2e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292ecc2d2054686520776569676874206f6620746869732063616c6c20697320646566696e6564206279207468652063616c6c65722e2c23203c2f7765696768743e1c7365745f6b657904010c6e657700018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650002285d0141757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f106b65792e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e402d204f6e65204442206368616e67652e2c23203c2f7765696768743e1c7375646f5f617308010c77686f00018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e00032c4d0141757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c207769746820605369676e656460206f726967696e2066726f6d406120676976656e206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e002823203c7765696768743e1c2d204f2831292e602d204c696d697465642073746f726167652072656164732e5c2d204f6e6520444220777269746520286576656e74292ec42d20576569676874206f662064657269766174697665206063616c6c6020657865637574696f6e202b2031302c3030302e2c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ecd050c4070616c6c65745f626167735f6c6973741870616c6c65741043616c6c0804540004490001081472656261670401286469736c6f6361746564000130543a3a4163636f756e74496400002859014465636c617265207468617420736f6d6520606469736c6f636174656460206163636f756e74206861732c207468726f7567682072657761726473206f722070656e616c746965732c2073756666696369656e746c7951016368616e676564206974732073636f726520746861742069742073686f756c642070726f7065726c792066616c6c20696e746f206120646966666572656e7420626167207468616e206974732063757272656e74106f6e652e001d01416e796f6e652063616e2063616c6c20746869732066756e6374696f6e2061626f757420616e7920706f74656e7469616c6c79206469736c6f6361746564206163636f756e742e00490157696c6c20616c7761797320757064617465207468652073746f7265642073636f7265206f6620606469736c6f63617465646020746f2074686520636f72726563742073636f72652c206261736564206f6e406053636f726550726f7669646572602e00d4496620606469736c6f63617465646020646f6573206e6f74206578697374732c2069742072657475726e7320616e206572726f722e3c7075745f696e5f66726f6e745f6f6604011c6c696768746572000130543a3a4163636f756e744964000120d04d6f7665207468652063616c6c65722773204964206469726563746c7920696e2066726f6e74206f6620606c696768746572602e005901546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e642063616e206f6e6c792062652063616c6c656420627920746865204964206f66a0746865206163636f756e7420676f696e6720696e2066726f6e74206f6620606c696768746572602e00344f6e6c7920776f726b73206966942d20626f7468206e6f646573206172652077697468696e207468652073616d65206261672cd02d20616e6420606f726967696e602068617320612067726561746572206053636f726560207468616e20606c696768746572602e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed1050c3870616c6c65745f76657374696e671870616c6c65741043616c6c0404540001141076657374000034b8556e6c6f636b20616e79207665737465642066756e6473206f66207468652073656e646572206163636f756e742e005d01546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20616e64207468652073656e646572206d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20322052656164732c203220577269746573f8202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745dfc202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c205b53656e646572204163636f756e745d2c23203c2f7765696768743e28766573745f6f7468657204011874617267657400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500013cb8556e6c6f636b20616e79207665737465642066756e6473206f662061206074617267657460206163636f756e742e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0051012d2060746172676574603a20546865206163636f756e742077686f7365207665737465642066756e64732073686f756c6420626520756e6c6f636b65642e204d75737420686176652066756e6473207374696c6c646c6f636b656420756e64657220746869732070616c6c65742e00d0456d69747320656974686572206056657374696e67436f6d706c6574656460206f72206056657374696e6755706461746564602e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c203320577269746573f0202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e74f4202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c23203c2f7765696768743e3c7665737465645f7472616e7366657208011874617267657400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65d50501a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00024464437265617465206120766573746564207472616e736665722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00cc2d2060746172676574603a20546865206163636f756e7420726563656976696e6720746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20332052656164732c2033205772697465733901202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d3d01202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c205b53656e646572204163636f756e745d2c23203c2f7765696768743e54666f7263655f7665737465645f7472616e736665720c0118736f7572636500018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636500011874617267657400018c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263650001207363686564756c65d50501a456657374696e67496e666f3c42616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e00034860466f726365206120766573746564207472616e736665722e00c4546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f526f6f745f2e00e82d2060736f75726365603a20546865206163636f756e742077686f73652066756e64732073686f756c64206265207472616e736665727265642e11012d2060746172676574603a20546865206163636f756e7420746861742073686f756c64206265207472616e7366657272656420746865207665737465642066756e64732ef02d20607363686564756c65603a205468652076657374696e67207363686564756c6520617474616368656420746f20746865207472616e736665722e005c456d697473206056657374696e6743726561746564602e00fc4e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b2e002823203c7765696768743e242d20604f283129602e742d2044625765696768743a20342052656164732c2034205772697465733101202020202d2052656164733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e743501202020202d205772697465733a2056657374696e672053746f726167652c2042616c616e636573204c6f636b732c20546172676574204163636f756e742c20536f75726365204163636f756e742c23203c2f7765696768743e3c6d657267655f7363686564756c657308013c7363686564756c65315f696e64657810010c75333200013c7363686564756c65325f696e64657810010c7533320004545d014d657267652074776f2076657374696e67207363686564756c657320746f6765746865722c206372656174696e672061206e65772076657374696e67207363686564756c65207468617420756e6c6f636b73206f7665725501746865206869676865737420706f737369626c6520737461727420616e6420656e6420626c6f636b732e20496620626f7468207363686564756c6573206861766520616c7265616479207374617274656420746865590163757272656e7420626c6f636b2077696c6c206265207573656420617320746865207363686564756c652073746172743b207769746820746865206361766561742074686174206966206f6e65207363686564756c655d0169732066696e6973686564206279207468652063757272656e7420626c6f636b2c20746865206f746865722077696c6c206265207472656174656420617320746865206e6577206d6572676564207363686564756c652c2c756e6d6f6469666965642e00f84e4f54453a20496620607363686564756c65315f696e646578203d3d207363686564756c65325f696e6465786020746869732069732061206e6f2d6f702e41014e4f54453a20546869732077696c6c20756e6c6f636b20616c6c207363686564756c6573207468726f756768207468652063757272656e7420626c6f636b207072696f7220746f206d657267696e672e61014e4f54453a20496620626f7468207363686564756c6573206861766520656e646564206279207468652063757272656e7420626c6f636b2c206e6f206e6577207363686564756c652077696c6c206265206372656174656464616e6420626f74682077696c6c2062652072656d6f7665642e006c4d6572676564207363686564756c6520617474726962757465733a35012d20607374617274696e675f626c6f636b603a20604d4158287363686564756c65312e7374617274696e675f626c6f636b2c207363686564756c6564322e7374617274696e675f626c6f636b2c48202063757272656e745f626c6f636b29602e21012d2060656e64696e675f626c6f636b603a20604d4158287363686564756c65312e656e64696e675f626c6f636b2c207363686564756c65322e656e64696e675f626c6f636b29602e59012d20606c6f636b6564603a20607363686564756c65312e6c6f636b65645f61742863757272656e745f626c6f636b29202b207363686564756c65322e6c6f636b65645f61742863757272656e745f626c6f636b29602e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e00e82d20607363686564756c65315f696e646578603a20696e646578206f6620746865206669727374207363686564756c6520746f206d657267652eec2d20607363686564756c65325f696e646578603a20696e646578206f6620746865207365636f6e64207363686564756c6520746f206d657267652e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632ed5050c3870616c6c65745f76657374696e673076657374696e675f696e666f2c56657374696e67496e666f081c42616c616e636501182c426c6f636b4e756d6265720110000c01186c6f636b656418011c42616c616e63650001247065725f626c6f636b18011c42616c616e63650001387374617274696e675f626c6f636b10012c426c6f636b4e756d6265720000d9050c3c70616c6c65745f6d756c74697369671870616c6c65741043616c6c0404540001105061735f6d756c74695f7468726573686f6c645f310801446f746865725f7369676e61746f72696573510501445665633c543a3a4163636f756e7449643e00011063616c6c19040160426f783c3c5420617320436f6e6669673e3a3a43616c6c3e0000405101496d6d6564696174656c792064697370617463682061206d756c74692d7369676e61747572652063616c6c207573696e6720612073696e676c6520617070726f76616c2066726f6d207468652063616c6c65722e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e003d012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f206172652070617274206f662074686501016d756c74692d7369676e61747572652c2062757420646f206e6f7420706172746963697061746520696e2074686520617070726f76616c2070726f636573732e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e00b8526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c742e002823203c7765696768743e19014f285a202b204329207768657265205a20697320746865206c656e677468206f66207468652063616c6c20616e6420432069747320657865637574696f6e207765696768742e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d442d204442205765696768743a204e6f6e65482d20506c75732043616c6c205765696768742c23203c2f7765696768743e2061735f6d756c74691801247468726573686f6c640904010c7531360001446f746865725f7369676e61746f72696573510501445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74dd0501844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00011063616c6ce10501344f706171756543616c6c3c543e00012873746f72655f63616c6c880110626f6f6c0001286d61785f7765696768742001185765696768740001b45501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e00b049662074686572652061726520656e6f7567682c207468656e206469737061746368207468652063616c6c2e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2e882d206063616c6c603a205468652063616c6c20746f2062652065786563757465642e001d014e4f54453a20556e6c6573732074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2067656e6572616c6c792077616e7420746f20757365190160617070726f76655f61735f6d756c74696020696e73746561642c2073696e6365206974206f6e6c7920726571756972657320612068617368206f66207468652063616c6c2e005901526573756c74206973206571756976616c656e7420746f20746865206469737061746368656420726573756c7420696620607468726573686f6c64602069732065786163746c79206031602e204f746865727769736555016f6e20737563636573732c20726573756c7420697320604f6b6020616e642074686520726573756c742066726f6d2074686520696e746572696f722063616c6c2c206966206974207761732065786563757465642cdc6d617920626520666f756e6420696e20746865206465706f736974656420604d756c7469736967457865637574656460206576656e742e002823203c7765696768743e502d20604f2853202b205a202b2043616c6c29602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2e21012d204f6e652063616c6c20656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285a296020776865726520605a602069732074782d6c656e2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e6c2d2054686520776569676874206f6620746865206063616c6c602e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e7c2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743a2101202020202d2052656164733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c60292501202020202d205772697465733a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c2043616c6c7320286966206073746f72655f63616c6c6029482d20506c75732043616c6c205765696768742c23203c2f7765696768743e40617070726f76655f61735f6d756c74691401247468726573686f6c640904010c7531360001446f746865725f7369676e61746f72696573510501445665633c543a3a4163636f756e7449643e00013c6d617962655f74696d65706f696e74dd0501844f7074696f6e3c54696d65706f696e743c543a3a426c6f636b4e756d6265723e3e00012463616c6c5f686173680401205b75383b2033325d0001286d61785f77656967687420011857656967687400028c5501526567697374657220617070726f76616c20666f72206120646973706174636820746f206265206d6164652066726f6d20612064657465726d696e697374696320636f6d706f73697465206163636f756e74206966f8617070726f766564206279206120746f74616c206f6620607468726573686f6c64202d203160206f6620606f746865725f7369676e61746f72696573602e002d015061796d656e743a20604465706f73697442617365602077696c6c20626520726573657276656420696620746869732069732074686520666972737420617070726f76616c2c20706c75733d01607468726573686f6c64602074696d657320604465706f736974466163746f72602e2049742069732072657475726e6564206f6e636520746869732064697370617463682068617070656e73206f723469732063616e63656c6c65642e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e59012d20606d617962655f74696d65706f696e74603a20496620746869732069732074686520666972737420617070726f76616c2c207468656e2074686973206d75737420626520604e6f6e65602e20496620697420697351016e6f742074686520666972737420617070726f76616c2c207468656e206974206d7573742062652060536f6d65602c2077697468207468652074696d65706f696e742028626c6f636b206e756d62657220616e64d47472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c207472616e73616374696f6e2ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e0035014e4f54453a2049662074686973206973207468652066696e616c20617070726f76616c2c20796f752077696c6c2077616e7420746f20757365206061735f6d756c74696020696e73746561642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602ed42d20557020746f206f6e652062696e6172792073656172636820616e6420696e736572742028604f286c6f6753202b20532960292ef82d20492f4f3a2031207265616420604f285329602c20757020746f2031206d757461746520604f285329602e20557020746f206f6e652072656d6f76652e302d204f6e65206576656e742e4d012d2053746f726167653a20696e7365727473206f6e65206974656d2c2076616c75652073697a6520626f756e64656420627920604d61785369676e61746f72696573602c20776974682061206465706f7369741901202074616b656e20666f7220697473206c69666574696d65206f6620604465706f73697442617365202b207468726573686f6c64202a204465706f736974466163746f72602e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743ab8202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745dbc202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c23203c2f7765696768743e3c63616e63656c5f61735f6d756c74691001247468726573686f6c640904010c7531360001446f746865725f7369676e61746f72696573510501445665633c543a3a4163636f756e7449643e00012474696d65706f696e74f8016454696d65706f696e743c543a3a426c6f636b4e756d6265723e00012463616c6c5f686173680401205b75383b2033325d000368550143616e63656c2061207072652d6578697374696e672c206f6e2d676f696e67206d756c7469736967207472616e73616374696f6e2e20416e79206465706f7369742072657365727665642070726576696f75736c79c4666f722074686973206f7065726174696f6e2077696c6c20626520756e7265736572766564206f6e20737563636573732e00cc546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e0055012d20607468726573686f6c64603a2054686520746f74616c206e756d626572206f6620617070726f76616c7320666f722074686973206469737061746368206265666f72652069742069732065786563757465642e41012d20606f746865725f7369676e61746f72696573603a20546865206163636f756e747320286f74686572207468616e207468652073656e646572292077686f2063616e20617070726f766520746869736c64697370617463682e204d6179206e6f7420626520656d7074792e5d012d206074696d65706f696e74603a205468652074696d65706f696e742028626c6f636b206e756d62657220616e64207472616e73616374696f6e20696e64657829206f662074686520666972737420617070726f76616c787472616e73616374696f6e20666f7220746869732064697370617463682ecc2d206063616c6c5f68617368603a205468652068617368206f66207468652063616c6c20746f2062652065786563757465642e002823203c7765696768743e242d20604f285329602ecc2d20557020746f206f6e652062616c616e63652d72657365727665206f7220756e72657365727665206f7065726174696f6e2e3d012d204f6e6520706173737468726f756768206f7065726174696f6e2c206f6e6520696e736572742c20626f746820604f285329602077686572652060536020697320746865206e756d626572206f66450120207369676e61746f726965732e206053602069732063617070656420627920604d61785369676e61746f72696573602c207769746820776569676874206265696e672070726f706f7274696f6e616c2ebc2d204f6e6520656e636f6465202620686173682c20626f7468206f6620636f6d706c657869747920604f285329602e302d204f6e65206576656e742e842d20492f4f3a2031207265616420604f285329602c206f6e652072656d6f76652e702d2053746f726167653a2072656d6f766573206f6e65206974656d2e882d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d302d204442205765696768743a1501202020202d20526561643a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c731901202020202d2057726974653a204d756c74697369672053746f726167652c205b43616c6c6572204163636f756e745d2c20526566756e64204163636f756e742c2043616c6c732c23203c2f7765696768743e042501436f6e7461696e73206f6e652076617269616e742070657220646973706174636861626c6520746861742063616e2062652063616c6c656420627920616e2065787472696e7369632edd0504184f7074696f6e04045401f80108104e6f6e6500000010536f6d650400f80000010000e10510346672616d655f737570706f727418747261697473106d69736344577261707065724b6565704f7061717565040454011904000800c90300000019040104540000e505083870616c6c65745f636f756e63696c1043616c6c04045400013048616e6e6f756e63655f63616e6469646163791001346d656d626572736869705f696420012c543a3a4d656d62657249640001487374616b696e675f6163636f756e745f6964000130543a3a4163636f756e7449640001447265776172645f6163636f756e745f6964000130543a3a4163636f756e7449640001147374616b6518012842616c616e63653c543e0000244c5375627363726962652063616e646964617465002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5c72656c656173655f63616e6469646163795f7374616b650401346d656d626572736869705f696420012c543a3a4d656d6265724964000124c452656c656173652063616e646964616379207374616b652074686174206973206e6f206c6f6e676572206e65656465642e002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4877697468647261775f63616e6469646163790401346d656d626572736869705f696420012c543a3a4d656d6265724964000224bc57697468647261772063616e64696461637920616e642072656c656173652063616e646964616379207374616b652e002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e487365745f63616e6469646163795f6e6f74650801346d656d626572736869705f696420012c543a3a4d656d62657249640001106e6f746528011c5665633c75383e00032879015365742073686f7274206465736372697074696f6e20666f7220746865207573657227732063616e6469646163792e2043616e2062652063616c6c656420616e7974696d6520647572696e67207573657227732063616e6469646163792e002823203c7765696768743e002423232077656967687438604f20284e29602077686572653a98604e60206973207468652073697a65206f6620606e6f74656020696e206b696c6f6279746573142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f62756467657404011c62616c616e636518012842616c616e63653c543e000424605365747320746865206275646765742062616c616e63652e002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e48706c616e5f6275646765745f726566696c6c04012c6e6578745f726566696c6c100138543a3a426c6f636b4e756d62657200052470506c616e20746865206e6578742062756467657420726566696c6c2e002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507365745f6275646765745f696e6372656d656e740401406275646765745f696e6372656d656e7418012842616c616e63653c543e0006247453657473207468652062756467657420726566696c6c20616d6f756e74002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507365745f636f756e63696c6f725f726577617264040140636f756e63696c6f725f72657761726418012842616c616e63653c543e0007248c536574732074686520636f756e63696c6f72207265776172642070657220626c6f636b002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c66756e64696e675f7265717565737404014066756e64696e675f7265717565737473390301dc5665633c46756e64696e6752657175657374506172616d65746572733c42616c616e63653c543e2c20543a3a4163636f756e7449643e3e000828b85472616e73666572732066756e64732066726f6d20636f756e63696c2062756467657420746f206163636f756e74002823203c7765696768743e002423232077656967687438604f20284629602077686572653a9c60466020697320746865206c656e677468206f66206066756e64696e675f726571756573747360142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4c66756e645f636f756e63696c5f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418012842616c616e63653c543e000124726174696f6e616c6528011c5665633c75383e0009209046756e642074686520636f756e63696c206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e40636f756e63696c6f725f72656d61726b080130636f756e63696c6f725f696420012c543a3a4d656d626572496400010c6d736728011c5665633c75383e000a2480436f756e63696c6f72206d616b657320612072656d61726b206d657373616765002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4063616e6469646174655f72656d61726b08013063616e6469646174655f696420012c543a3a4d656d626572496400010c6d736728011c5665633c75383e000b248043616e646964617465206d616b657320612072656d61726b206d657373616765002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ee905084470616c6c65745f7265666572656e64756d1043616c6c08045400044900010c10766f7465080128636f6d6d69746d656e7424011c543a3a486173680001147374616b6518013042616c616e63654f663c543e00002494436173742061207365616c656420766f746520696e20746865207265666572656e64756d2e002823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c72657665616c5f766f746508011073616c7428011c5665633c75383e000138766f74655f6f7074696f6e5f69642001d03c5420617320636f6d6d6f6e3a3a6d656d626572736869703a3a4d656d6265727368697054797065733e3a3a4d656d626572496400012c9c52657665616c2061207365616c656420766f746520696e20746865207265666572656e64756d2e002823203c7765696768743e002423232057656967687438604f20285729602077686572653a0d012d2060576020697320746865206e756d626572206f662060696e7465726d6564696174655f77696e6e657273602073746f72656420696e207468652063757272656e7468202020206053746167653a3a3c542c20493e3a3a676574282960142d2044423ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4872656c656173655f766f74655f7374616b650002205c52656c656173652061206c6f636b6564207374616b652e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652eed05084470616c6c65745f6d656d626572736869701043616c6c040454000144386275795f6d656d62657273686970040118706172616d73190101c84275794d656d62657273686970506172616d65746572733c543a3a4163636f756e7449642c20543a3a4d656d62657249643e00002c7c4e6f6e2d6d656d626572732063616e20627579206d656d626572736869702e00203c7765696768743e002423232057656967687448604f202857202b204d29602077686572653a942d20605760206973207468652068616e646c652073697a6520696e206b696c6f62797465739c2d20604d6020697320746865206d657461646174612073697a6520696e206b696c6f6279746573142d2044423a242020202d204f2831292c23203c2f7765696768743e387570646174655f70726f66696c650c01246d656d6265725f696420012c543a3a4d656d626572496400011868616e646c651d01013c4f7074696f6e3c5665633c75383e3e0001206d657461646174611d01013c4f7074696f6e3c5665633c75383e3e0001300d01557064617465206d656d626572277320616c6c206f7220736f6d65206f66206e616d652c2068616e646c652c2061766174617220616e642061626f757420746578742e7c4e6f20656666656374206966206e6f206368616e676564206669656c64732e00203c7765696768743e002423232057656967687448604f202857202b204d29602077686572653a942d20605760206973207468652068616e646c652073697a6520696e206b696c6f62797465739c2d20604d6020697320746865206d657461646174612073697a6520696e206b696c6f6279746573142d2044423a242020202d204f2831292c23203c2f7765696768743e3c7570646174655f6163636f756e74730c01246d656d6265725f696420012c543a3a4d656d62657249640001406e65775f726f6f745f6163636f756e74e801504f7074696f6e3c543a3a4163636f756e7449643e0001586e65775f636f6e74726f6c6c65725f6163636f756e74e801504f7074696f6e3c543a3a4163636f756e7449643e00022c550155706461746573206d656d62657220726f6f74206f7220636f6e74726f6c6c6572206163636f756e74732e204e6f2065666665637420696620626f7468206e6577206163636f756e74732061726520656d7074792e00203c7765696768743e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6c7570646174655f70726f66696c655f766572696669636174696f6e0c0124776f726b65725f6964200128543a3a4163746f7249640001407461726765745f6d656d6265725f696420012c543a3a4d656d626572496400012c69735f7665726966696564880110626f6f6c000324450155706461746573206d656d6265722070726f66696c6520766572696669636174696f6e207374617475732e20526571756972657320776f726b696e672067726f7570206d656d626572206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e407365745f726566657272616c5f63757404013470657263656e745f76616c75650801087538000424110155706461746573206d656d6265727368697020726566657272616c206375742070657263656e742076616c75652e20526571756972657320726f6f74206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e407472616e736665725f696e76697465730c0140736f757263655f6d656d6265725f696420012c543a3a4d656d62657249640001407461726765745f6d656d6265725f696420012c543a3a4d656d62657249640001446e756d6265725f6f665f696e766974657310010c753332000524b45472616e736665727320696e76697465732066726f6d206f6e65206d656d62657220746f20616e6f746865722e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34696e766974655f6d656d626572040118706172616d73250101d4496e766974654d656d62657273686970506172616d65746572733c543a3a4163636f756e7449642c20543a3a4d656d62657249643e00062c50496e766974652061206e6577206d656d6265722e00203c7765696768743e002423232057656967687448604f202857202b204d29602077686572653a942d20605760206973207468652068616e646c652073697a6520696e206b696c6f62797465739c2d20604d6020697320746865206d657461646174612073697a6520696e206b696c6f6279746573142d2044423a242020202d204f2831292c23203c2f7765696768743e3c676966745f6d656d62657273686970040118706172616d732d0101d0476966744d656d62657273686970506172616d65746572733c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e00070c1d01476966742061206d656d62657273686970207573696e67206f776e2066756e64732e2047696674657220646f6573206e6f74206e65656420746f2062652061206d656d6265722e5d0143616e206f7074696e616c6c79206170706c792061206c6f636b206f6e206120706f7274696f6e206f66207468652066756e6473207472616e7366657272656420746f20726f6f7420616e6420636f6e74726f6c6c6572b86163636f756e74732e2047696674657220616c736f207061797320746865206d656d62657273686970206665652e507365745f6d656d626572736869705f70726963650401246e65775f707269636518013042616c616e63654f663c543e000824bc55706461746573206d656d626572736869702070726963652e20526571756972657320726f6f74206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6c7365745f6c65616465725f696e7669746174696f6e5f71756f7461040140696e7669746174696f6e5f71756f746110010c753332000924d855706461746573206c656164657220696e7669746174696f6e2071756f74612e20526571756972657320726f6f74206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e787365745f696e697469616c5f696e7669746174696f6e5f62616c616e636504014c6e65775f696e697469616c5f62616c616e636518013042616c616e63654f663c543e000a2439015570646174657320696e697469616c20696e7669746174696f6e2062616c616e636520666f72206120696e7669746564206d656d6265722e20526571756972657320726f6f74206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e707365745f696e697469616c5f696e7669746174696f6e5f636f756e740401506e65775f696e7669746174696f6e5f636f756e7410010c753332000b2411015570646174657320696e697469616c20696e7669746174696f6e20636f756e7420666f722061206d656d6265722e20526571756972657320726f6f74206f726967696e2e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e746164645f7374616b696e675f6163636f756e745f63616e6469646174650401246d656d6265725f696420012c543a3a4d656d6265724964000c28ac416464207374616b696e67206163636f756e742063616e64696461746520666f722061206d656d6265722eb8546865206d656d62657273686970206d75737420626520636f6e6669726d6564206265666f72652075736167652e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5872656d6f76655f7374616b696e675f6163636f756e740401246d656d6265725f696420012c543a3a4d656d6265724964000d249052656d6f7665207374616b696e67206163636f756e7420666f722061206d656d6265722e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5c636f6e6669726d5f7374616b696e675f6163636f756e740801246d656d6265725f696420012c543a3a4d656d62657249640001487374616b696e675f6163636f756e745f6964000130543a3a4163636f756e744964000e24bc436f6e6669726d207374616b696e67206163636f756e742063616e64696461746520666f722061206d656d6265722e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e346d656d6265725f72656d61726b0801246d656d6265725f696420012c543a3a4d656d626572496400010c6d736728011c5665633c75383e000f24544d656d626572206d616b657320612072656d61726b00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e346372656174655f6d656d626572040118706172616d73290101904372656174654d656d626572506172616d65746572733c543a3a4163636f756e7449643e00102c804372656174652061206d656d6265722070726f66696c6520617320726f6f742e00203c7765696768743e002423232057656967687448604f202849202b204a29602077686572653a942d20604960206973207468652068616e646c652073697a6520696e206b696c6f62797465739c2d20604a6020697320746865206d657461646174612073697a6520696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ef105083070616c6c65745f666f72756d1043616c6c0404540001409c7570646174655f63617465676f72795f6d656d626572736869705f6f665f6d6f64657261746f720c01306d6f64657261746f725f69642001384d6f64657261746f7249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001246e65775f76616c7565880110626f6f6c0000240901456e61626c652061206d6f64657261746f722063616e206d6f64657261746520612063617465676f727920616e6420697473207375622063617465676f726965732e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c6372656174655f63617465676f72790c0148706172656e745f63617465676f72795f6964210101544f7074696f6e3c543a3a43617465676f727949643e0001147469746c6528011c5665633c75383e00012c6465736372697074696f6e28011c5665633c75383e0001304c4164642061206e65772063617465676f72792e00203c7765696768743e002423232057656967687458604f202857202b2056202b205829602077686572653a6c2d20605760206973207468652063617465676f7279206465707468d42d20605660206973207468652073697a65206f66207468652063617465676f7279207469746c6520696e206b696c6f62797465732eec2d20605860206973207468652073697a65206f66207468652063617465676f7279206465736372697074696f6e20696e206b696c6f62797465732e142d2044423a242020202d204f2857292c23203c2f7765696768743e7c7570646174655f63617465676f72795f617263686976616c5f7374617475730c01146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f7279496400014c6e65775f617263686976616c5f737461747573880110626f6f6c0002285855706461746520617263686976616c2073746174757300203c7765696768743e002423232057656967687438604f20285729602077686572653a6c2d20605760206973207468652063617465676f7279206465707468142d2044423a242020202d204f2857292c23203c2f7765696768743e547570646174655f63617465676f72795f7469746c650c01146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001147469746c6528011c5665633c75383e00032c545570646174652063617465676f7279207469746c6500203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a6c2d20605760206973207468652063617465676f7279206465707468d42d20605660206973207468652073697a65206f66207468652063617465676f7279207469746c6520696e206b696c6f62797465732e142d2044423a242020202d204f2857292c23203c2f7765696768743e6c7570646174655f63617465676f72795f6465736372697074696f6e0c01146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f7279496400012c6465736372697074696f6e28011c5665633c75383e00042c6c5570646174652063617465676f7279206465736372697074696f6e00203c7765696768743e002423232057656967687438604f20285729602077686572653a6c2d20605760206973207468652063617465676f7279206465707468ec2d20605660206973207468652073697a65206f66207468652063617465676f7279206465736372697074696f6e20696e206b696c6f62797465732e142d2044423a242020202d204f2857292c23203c2f7765696768743e3c64656c6574655f63617465676f72790801146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640005283c44656c6574652063617465676f727900203c7765696768743e002423232057656967687438604f20285729602077686572653a6c2d20605760206973207468652063617465676f7279206465707468142d2044423a242020202d204f2857292c23203c2f7765696768743e346372656174655f746872656164100134666f72756d5f757365725f6964200138466f72756d5573657249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001206d6574616461746128011c5665633c75383e0001107465787428011c5665633c75383e00063074437265617465206e65772074687265616420696e2063617465676f727900203c7765696768743e002423232057656967687458604f202857202b2056202b205829602077686572653a6c2d20605760206973207468652063617465676f7279206465707468cc2d20605660206973207468652073697a65206f662074686520746872656164207469746c6520696e206b696c6f62797465732ec82d20605860206973207468652073697a65206f662074686520746872656164207465787420696e206b696c6f62797465732e142d2044423a242020202d204f2857292c23203c2f7765696768743e50656469745f7468726561645f6d65746164617461100134666f72756d5f757365725f6964200138466f72756d5573657249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a54687265616449640001306e65775f6d6574616461746128011c5665633c75383e00072c504564697420746872656164206d6574616461746100203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a6c2d20605760206973207468652063617465676f7279206465707468d82d20605660206973207468652073697a65206f662074686520746872656164206d6574616461746120696e206b696c6f62797465732e142d2044423a242020202d204f2857292c23203c2f7765696768743e3464656c6574655f746872656164100134666f72756d5f757365725f6964200138466f72756d5573657249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a546872656164496400011068696465880110626f6f6c0008283444656c6574652074687265616400203c7765696768743e002423232057656967687438604f20285729602077686572653a6c2d20605760206973207468652063617465676f7279206465707468142d2044423a242020202d204f2857292c23203c2f7765696768743e5c6d6f76655f7468726561645f746f5f63617465676f72791001146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a546872656164496400013c6e65775f63617465676f72795f6964200134543a3a43617465676f727949640009287c4d6f76652074687265616420746f20616e6f746865722063617465676f727900203c7765696768743e002423232057656967687438604f20285729602077686572653a6c2d20605760206973207468652063617465676f7279206465707468142d2044423a242020202d204f2857292c23203c2f7765696768743e3c6d6f6465726174655f7468726561641001146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a5468726561644964000124726174696f6e616c6528011c5665633c75383e000a303c4d6f6465726174652074687265616400203c7765696768743e002423232057656967687458604f202857202b2056202b205829602077686572653a702d20605760206973207468652063617465676f72792064657074682c902d2060566020697320746865206e756d626572206f662074687265616420706f7374732cbc2d20605860206973207468652073697a65206f662074686520726174696f6e616c6520696e206b696c6f6279746573142d2044423a342020202d204f2857202b2056292c23203c2f7765696768743e206164645f706f7374140134666f72756d5f757365725f6964200138466f72756d5573657249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a54687265616449640001107465787428011c5665633c75383e0001206564697461626c65880110626f6f6c000b2c2041646420706f737400203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a702d20605760206973207468652063617465676f72792064657074682ca82d20605660206973207468652073697a65206f6620746865207465787420696e206b696c6f6279746573142d2044423a242020202d204f2857292c23203c2f7765696768743e38656469745f706f73745f74657874140134666f72756d5f757365725f6964200138466f72756d5573657249643c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a546872656164496400011c706f73745f6964200124543a3a506f737449640001206e65775f7465787428011c5665633c75383e000c2c384564697420706f7374207465787400203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a702d20605760206973207468652063617465676f72792064657074682cb82d20605660206973207468652073697a65206f6620746865206e6577207465787420696e206b696c6f6279746573142d2044423a242020202d204f2857292c23203c2f7765696768743e346d6f6465726174655f706f73741401146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f727949640001247468726561645f696420012c543a3a546872656164496400011c706f73745f6964200124543a3a506f73744964000124726174696f6e616c6528011c5665633c75383e000d2c344d6f64657261746520706f737400203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a702d20605760206973207468652063617465676f72792064657074682cbc2d20605660206973207468652073697a65206f662074686520726174696f6e616c6520696e206b696c6f6279746573142d2044423a242020202d204f2857292c23203c2f7765696768743e3064656c6574655f706f7374730c0134666f72756d5f757365725f6964200138466f72756d5573657249643c543e000114706f7374734101018442547265654d61703c457874656e646564506f737449643c543e2c20626f6f6c3e000124726174696f6e616c6528011c5665633c75383e000e346444656c65746520706f73742066726f6d2073746f726167652eec596f75206e65656420746f2070726f76696465206120766563746f72206f6620706f73747320746f2064656c65746520696e2074686520666f726db428543a3a43617465676f727949642c20543a3a54687265616449642c20543a3a506f737449642c20626f6f6c292501776865726520746865206c61737420626f6f6c206973207768657468657220796f752077616e7420746f20686964652069742061706172742066726f6d2064656c6574696e67206974002423232057656967687458604f202857202b2056202b205029602077686572653a702d20605760206973207468652063617465676f72792064657074682cbc2d20605660206973207468652073697a65206f662074686520726174696f6e616c6520696e206b696c6f6279746573982d2060506020697320746865206e756d626572206f6620706f73747320746f2064656c657465142d2044423a342020202d204f2857202b2050292c23203c2f7765696768743e507365745f737469636b6965645f746872656164730c01146163746f723901014850726976696c656765644163746f723c543e00012c63617465676f72795f6964200134543a3a43617465676f72794964000130737469636b6965645f6964734d01015442547265655365743c543a3a54687265616449643e000f2c8453657420737469636b696564207468726561647320666f722063617465676f727900203c7765696768743e002423232057656967687448604f202857202b205629602077686572653a702d20605760206973207468652063617465676f72792064657074682c9c2d2060566020697320746865206c656e677468206f662074686520737469636b6965645f696473142d2044423a342020202d204f2857202b2056292c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ef505084c70616c6c65745f636f6e737469747574696f6e1043616c6c04045400010448616d656e645f636f6e737469747574696f6e040144636f6e737469747574696f6e5f7465787428011c5665633c75383e000018e453657473207468652063757272656e7420636f6e737469747574696f6e20686173682e20526571756972657320726f6f74206f726967696e2e2823203c7765696768743e11012d20436f6d706c65786974793a20604f28432960207768657265204320697320746865206c656e677468206f662074686520636f6e737469747574696f6e20746578742e342d2044622072656164733a20307c2d204462207772697465733a20312028636f6e7374616e742076616c7565292c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652ef905083470616c6c65745f626f756e74791043616c6c04045400013c346372656174655f626f756e7479080118706172616d735901016c426f756e74794372656174696f6e506172616d65746572733c543e0001206d6574616461746128011c5665633c75383e000028490143726561746573206120626f756e74792e204d657461646174612073746f72656420696e20746865207472616e73616374696f6e206c6f67206275742064697363617264656420616674657220746861742e203c7765696768743e002423232057656967687438604f20285729602077686572653aa42d2060576020697320746865205f6d657461646174612073697a6520696e206b696c6f62797465732eb02d20604d6020697320636c6f73656420636f6e7472616374206d656d626572206c697374206c656e6774682e142d2044423a842020202d204f284d2920284f283129206f6e206f70656e20636f6e7472616374292c23203c2f7765696768743e2c66756e645f626f756e74790c011866756e6465725d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e74794964000118616d6f756e7418013042616c616e63654f663c543e0001206050726f766964657320626f756e74792066756e64696e672e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e407465726d696e6174655f626f756e7479040124626f756e74795f696420012c543a3a426f756e74794964000224c05465726d696e61746573206120626f756e747920696e2066756e64696e672c2066756e64696e6720657870697265642c7c776f726b7375626d697373696f6e2c206a756467696e6720706572696f642e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e347377697463685f6f7261636c650801286e65775f6f7261636c655d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e74794964000324904f7261636c652073776974636865732068696d73656c6620746f2061206e6577206f6e652823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e004077697468647261775f66756e64696e6708011866756e6465725d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e74794964000420c4576974686472617720626f756e74792066756e64696e672062792061206d656d626572206f72206120636f756e63696c2e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4c616e6e6f756e63655f776f726b5f656e7472791001246d656d6265725f696420012c4d656d62657249643c543e000124626f756e74795f696420012c543a3a426f756e747949640001487374616b696e675f6163636f756e745f6964000130543a3a4163636f756e744964000140776f726b5f6465736372697074696f6e28011c5665633c75383e000528b0416e6e6f756e636520776f726b20656e74727920666f722061207375636365737366756c20626f756e74792e2823203c7765696768743e002423232077656967687448604f202857202b204d29602077686572653ac02d206057602069732074686520776f726b5f6465736372697074696f6e2073697a6520696e206b696c6f62797465732eb02d20604d6020697320636c6f73656420636f6e7472616374206d656d626572206c697374206c656e6774682e142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c7375626d69745f776f726b1001246d656d6265725f696420012c4d656d62657249643c543e000124626f756e74795f696420012c543a3a426f756e74794964000120656e7472795f6964200128543a3a456e7472794964000124776f726b5f6461746128011c5665633c75383e000624645375626d697420776f726b20666f72206120626f756e74792e2823203c7765696768743e00242323207765696768741c604f20284e2960a42d20604e602069732074686520776f726b5f646174612073697a6520696e206b696c6f62797465732c142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e48656e645f776f726b696e675f706572696f64040124626f756e74795f696420012c543a3a426f756e7479496400072068656e6420626f756e747920776f726b696e6720706572696f642e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e587375626d69745f6f7261636c655f6a7564676d656e740c0124626f756e74795f696420012c543a3a426f756e747949640001206a7564676d656e74690101a04f7261636c654a7564676d656e743c543a3a456e74727949642c2042616c616e63654f663c543e3e000124726174696f6e616c6528011c5665633c75383e00083819015375626d69747320616e206f7261636c65206a7564676d656e7420666f72206120626f756e74792c20736c617368696e672074686520656e74726965732072656a65637465642d01627920616e206172626974726172792070657263656e7461676520616e6420726577617264696e67207468652077696e6e65727320627920616e2061726269747261727920616d6f756e7498286e6f742073757270617373696e672074686520746f74616c2066756e6420616d6f756e74292823203c7765696768743e00242323207765696768744c604f20284a202b204b202b2057202b20522960942d20604a6020697320726174696f6e616c652073697a6520696e206b696c6f62797465732c61012d20604b60206973207468652073756d206f6620616c6c20616374696f6e5f6a757374696669636174696f6e2073697a65732028696e206b696c6f62797465732920696e73696465204f7261636c654a7564676d656e742cac2d20605760206973206e756d626572206f662077696e6e6572206a7564676d656e7420656e74726965732cb42d20605260206973206e756d626572206f662072656a6563746564206a7564676d656e7420656e74726965732c142d2064623a3c2020202d20604f2857202b205229602c23203c2f7765696768743e5877697468647261775f656e7472616e745f7374616b650c01246d656d6265725f696420012c4d656d62657249643c543e000124626f756e74795f696420012c543a3a426f756e74794964000120656e7472795f6964200128543a3a456e7472794964000928a4556e6c6f636b7320746865207374616b652072656c6174656420746f206120776f726b20656e747279a901416674657220746865206f7261636c65206d616b657320746865206a7564676d656e74206f722074686520636f756e63696c207465726d696e617465732074686520626f756e74792062792063616c6c696e67207465726d696e6174655f626f756e7479282e2e2e292c51016561636820776f726b65722077686f736520656e74727920686173206e6f74206265656e206a75646765642c2063616e20756e6c6f636b2074686520746f74616c697479206f66207468656972207374616b652e2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5877697468647261775f6f7261636c655f726577617264040124626f756e74795f696420012c543a3a426f756e74794964000a2890576974687261777320746865206f7261636c652072657761726420746f206f7261636c651101496620626f756e7479206973207375636365737366756c6c792c204661696c6564206f722043616e63656c6c6564206f7261636c65206d7573742063616c6c2074686973a065787472696e73696320746f20776974686472617720746865206f7261636c65207265776172642c2823203c7765696768743e00242323207765696768741c604f2028312960142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e48636f6e7472696275746f725f72656d61726b0c012c636f6e7472696275746f725d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e7479496400010c6d736728011c5665633c75383e000b2880426f756e747920436f6e7472696275746f72206d61646520612072656d61726b002823203c7765696768743e00242323207765696768741c604f20284e2960782d20604e60206973206d73672073697a6520696e206b696c6f6279746573142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e346f7261636c655f72656d61726b0c01186f7261636c655d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e7479496400010c6d736728011c5665633c75383e000c286c426f756e7479204f7261636c65206d61646520612072656d61726b002823203c7765696768743e00242323207765696768741c604f20284e2960782d20604e60206973206d73672073697a6520696e206b696c6f6279746573142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38656e7472616e745f72656d61726b100128656e7472616e745f696420012c4d656d62657249643c543e000124626f756e74795f696420012c543a3a426f756e74794964000120656e7472795f6964200128543a3a456e747279496400010c6d736728011c5665633c75383e000d288c426f756e747920456e7472616e7420576f726b6572206d61646520612072656d61726b002823203c7765696768743e00242323207765696768741c604f20284e2960782d20604e60206973206d73672073697a6520696e206b696c6f6279746573142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863726561746f725f72656d61726b0c011c63726561746f725d010160426f756e74794163746f723c4d656d62657249643c543e3e000124626f756e74795f696420012c543a3a426f756e7479496400010c6d736728011c5665633c75383e000e286c426f756e7479204f7261636c65206d61646520612072656d61726b002823203c7765696768743e00242323207765696768741c604f20284e2960782d20604e60206973206d73672073697a6520696e206b696c6f6279746573142d2064623ad42020202d20604f2831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652efd05083870616c6c65745f7574696c6974791043616c6c0404540001105c657865637574655f7369676e616c5f70726f706f73616c0401187369676e616c28011c5665633c75383e00002871015369676e616c2070726f706f73616c2065787472696e7369632e2053686f756c6420626520757365642061732063616c6c61626c65206f626a65637420746f207061737320746f207468652060656e67696e6560206d6f64756c652e00203c7765696768743e002423232057656967687438604f20285329602077686572653ab02d20605360206973207468652073697a65206f6620746865207369676e616c20696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e80657865637574655f72756e74696d655f757067726164655f70726f706f73616c0401107761736d28011c5665633c75383e0001288c52756e74696d6520757067726164652070726f706f73616c2065787472696e7369632e050153686f756c6420626520757365642061732063616c6c61626c65206f626a65637420746f207061737320746f207468652060656e67696e6560206d6f64756c652e203c7765696768743e002423232057656967687438604f20284329602077686572653a742d2060436020697320746865206c656e677468206f6620607761736d603d01486f77657665722c207765207472656174207468697320617320612066756c6c20626c6f636b20617320606672616d655f73797374656d3a3a4d6f64756c653a3a7365745f636f64656020646f65732c23203c2f7765696768743ebd01235b776569676874203d2028543a3a426c6f636b576569676874733a3a67657428292e676574284469737061746368436c6173733a3a4f7065726174696f6e616c292e626173655f65787472696e7369632c204469737061746368436c6173733a3a4f7065726174696f6e616c295d6c7570646174655f776f726b696e675f67726f75705f6275646765740c0134776f726b696e675f67726f75707d010130576f726b696e6747726f7570000118616d6f756e7418013042616c616e63654f663c543e00013062616c616e63655f6b696e648101012c42616c616e63654b696e640002206c55706461746520776f726b696e672067726f757020627564676574203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4c6275726e5f6163636f756e745f746f6b656e73040118616d6f756e7418013042616c616e63654f663c543e000320784275726e7320746f6b656e20666f722063616c6c6572206163636f756e74203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e0106083870616c6c65745f636f6e74656e741043616c6c04045400010101506372656174655f63757261746f725f67726f757008012469735f616374697665880110626f6f6c0001507065726d697373696f6e735f62795f6c6576656c3902017c4d6f6465726174696f6e5065726d697373696f6e7342794c6576656c3c543e000028a0416464206e65772063757261746f722067726f757020746f2072756e74696d652073746f7261676500203c7765696768743e002423232057656967687438604f20284129602077686572653af02d2060416020697320746865206e756d626572206f6620656e747269657320696e20607065726d697373696f6e735f62795f6c6576656c60206d6170142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e807570646174655f63757261746f725f67726f75705f7065726d697373696f6e7308014063757261746f725f67726f75705f6964200144543a3a43757261746f7247726f757049640001507065726d697373696f6e735f62795f6c6576656c3902017c4d6f6465726174696f6e5065726d697373696f6e7342794c6576656c3c543e000128ac557064617465206578697374696e672063757261746f722067726f75702773207065726d697373696f6e7300203c7765696768743e002423232057656967687438604f20284129602077686572653af02d2060416020697320746865206e756d626572206f6620656e747269657320696e20607065726d697373696f6e735f62795f6c6576656c60206d6170142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e607365745f63757261746f725f67726f75705f73746174757308014063757261746f725f67726f75705f6964200144543a3a43757261746f7247726f7570496400012469735f616374697665880110626f6f6c0002241d01536574206069735f616374697665602073746174757320666f722063757261746f722067726f757020756e64657220676976656e206063757261746f725f67726f75705f69646000203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e506164645f63757261746f725f746f5f67726f75700c014063757261746f725f67726f75705f6964200144543a3a43757261746f7247726f7570496400012863757261746f725f6964200130543a3a43757261746f72496400012c7065726d697373696f6e73a101015c4368616e6e656c4167656e745065726d697373696f6e73000324ec4164642063757261746f7220746f2063757261746f722067726f757020756e64657220676976656e206063757261746f725f67726f75705f69646000203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6472656d6f76655f63757261746f725f66726f6d5f67726f757008014063757261746f725f67726f75705f6964200144543a3a43757261746f7247726f7570496400012863757261746f725f6964200130543a3a43757261746f724964000424a452656d6f76652063757261746f722066726f6d206120676976656e2063757261746f722067726f757000203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e386372656174655f6368616e6e656c0801346368616e6e656c5f6f776e6572c90101b04368616e6e656c4f776e65723c543a3a4d656d62657249642c20543a3a43757261746f7247726f757049643e000118706172616d73f90101704368616e6e656c4372656174696f6e506172616d65746572733c543e000530203c7765696768743e002423232057656967687478604f202841202b2042202b2043202b2044202b204529602077686572653ae02d2060416020697320746865206e756d626572206f6620656e747269657320696e2060706172616d732e636f6c6c61626f7261746f727360e02d2060426020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e73746f726167655f6275636b65747360f42d2060436020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e646973747269627574696f6e5f6275636b6574736011012d2060446020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e6173736574732e6f626a6563745f6372656174696f6e5f6c69737460c02d20604560206973207468652073697a65206f66202060706172616d732e6d6574616020696e206b696c6f6279746573142d2044423ae02020202d20604f2841202b2042202b2043202b20442960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e387570646174655f6368616e6e656c0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964000118706172616d73250201684368616e6e656c557064617465506172616d65746572733c543e000630203c7765696768743e002423232057656967687478604f202841202b2042202b2043202b2044202b204529602077686572653ae02d2060416020697320746865206e756d626572206f6620656e747269657320696e2060706172616d732e636f6c6c61626f7261746f72736071012d2060426020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e6173736574735f746f5f75706c6f61642e6f626a6563745f6372656174696f6e5f6c69737460202869662070726f766964656429e42d2060436020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e6173736574735f746f5f72656d6f766560cc2d20604460206973207468652073697a65206f662060706172616d732e6e65775f6d6574616020696e206b696c6f6279746573ec2d206045602069732060706172616d732e73746f726167655f6275636b6574735f6e756d5f7769746e65737360202869662070726f766964656429142d2044423ae02020202d20604f2841202b2042202b2043202b20452960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e787570646174655f6368616e6e656c5f70726976696c6567655f6c6576656c0801286368616e6e656c5f6964200130543a3a4368616e6e656c496400014c6e65775f70726976696c6567655f6c6576656c080160543a3a4368616e6e656c50726976696c6567654c6576656c000724150145787472696e73696320666f72207570646174696e67206368616e6e656c2070726976696c656765206c6576656c20287265717569726573206c656164206163636573732900203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743ea07365745f6368616e6e656c5f7061757365645f66656174757265735f61735f6d6f64657261746f721001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400014c6e65775f7061757365645f6665617475726573bd01018042547265655365743c5061757361626c654368616e6e656c466561747572653e000124726174696f6e616c6528011c5665633c75383e000828c845787472696e73696320666f722070617573696e672f72652d656e61626c696e67206368616e6e656c20666561747572657300203c7765696768743e002423232057656967687438604f20284129602077686572653ab42d20604160206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656c6574655f6368616e6e656c1001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400014c6368616e6e656c5f6261675f7769746e657373050601444368616e6e656c4261675769746e6573730001546e756d5f6f626a656374735f746f5f64656c65746520010c753634000928203c7765696768743e002423232057656967687458604f202841202b2042202b204329602077686572653a802d2060416020697320606e756d5f6f626a656374735f746f5f64656c65746560c82d2060426020697320606368616e6e656c5f6261675f7769746e6573732e73746f726167655f6275636b6574735f6e756d60dc2d2060436020697320606368616e6e656c5f6261675f7769746e6573732e646973747269627574696f6e5f6275636b6574735f6e756d60142d2044423ad02020202d20604f2841202b2042202b20432960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e8864656c6574655f6368616e6e656c5f6173736574735f61735f6d6f64657261746f721401146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c49640001406173736574735f746f5f72656d6f76654d01016442547265655365743c446174614f626a65637449643c543e3e00016c73746f726167655f6275636b6574735f6e756d5f7769746e65737310010c753332000124726174696f6e616c6528011c5665633c75383e000a28203c7765696768743e002423232057656967687458604f202841202b2042202b204329602077686572653aa42d2060416020697320746865206c656e677468206f6620606173736574735f746f5f72656d6f766560cc2d20604260206973207468652076616c7565206f66206073746f726167655f6275636b6574735f6e756d5f7769746e65737360b42d20604360206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423ac02020202d20604f2841202b20422960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e6c64656c6574655f6368616e6e656c5f61735f6d6f64657261746f721401146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400014c6368616e6e656c5f6261675f7769746e657373050601444368616e6e656c4261675769746e6573730001546e756d5f6f626a656374735f746f5f64656c65746520010c753634000124726174696f6e616c6528011c5665633c75383e000b008c7365745f6368616e6e656c5f7669736962696c6974795f61735f6d6f64657261746f721001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400012469735f68696464656e880110626f6f6c000124726174696f6e616c6528011c5665633c75383e000c28350145787472696e73696320666f722073657474696e67206368616e6e656c207669736962696c69747920737461747573202868696464656e2f76697369626c6529206279206d6f64657261746f7200203c7765696768743e002423232057656967687438604f20284129602077686572653ab42d20604160206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e306372656174655f766964656f0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964000118706172616d732d020168566964656f4372656174696f6e506172616d65746572733c543e000d2c203c7765696768743e002423232057656967687468604f202841202b2042202b2043202b204429602077686572653a11012d2060416020697320746865206e756d626572206f66206974656d7320696e2060706172616d732e6173736574732e6f626a6563745f6372656174696f6e5f6c69737460b42d206042602069732060706172616d732e73746f726167655f6275636b6574735f6e756d5f7769746e6573736035012d2060436020697320746865206c656e677468206f66206f70656e2061756374696f6e202f20656e676c6973682061756374696f6e2077686974656c697374202869662070726f766964656429f42d20604460206973207468652073697a65206f662060706172616d732e6d6574616020696e206b696c6f6279746573202869662070726f766964656429142d2044423ad02020202d20604f2841202b2042202b20432960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e307570646174655f766964656f0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964000118706172616d7335020160566964656f557064617465506172616d65746572733c543e000e30203c7765696768743e002423232057656967687478604f202841202b2042202b2043202b2044202b204529602077686572653a25012d2060416020697320706172616d732e6173736574735f746f5f75706c6f61642e6f626a6563745f6372656174696f6e5f6c6973742e6c656e2829202869662070726f766964656429982d2060426020697320706172616d732e6173736574735f746f5f72656d6f76652e6c656e2829ec2d206043602069732060706172616d732e73746f726167655f6275636b6574735f6e756d5f7769746e65737360202869662070726f76696465642935012d2060446020697320746865206c656e677468206f66206f70656e2061756374696f6e202f20656e676c6973682061756374696f6e2077686974656c697374202869662070726f76696465642905012d20604560206973207468652073697a65206f662060706172616d732e6e65775f6d6574616020696e206b696c6f6279746573202869662070726f766964656429142d2044423ae02020202d20604f2841202b2042202b2043202b20442960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e3064656c6574655f766964656f1001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f49640001546e756d5f6f626a656374735f746f5f64656c65746520010c75363400016c73746f726167655f6275636b6574735f6e756d5f7769746e657373e501012c4f7074696f6e3c7533323e000f24203c7765696768743e002423232057656967687448604f202841202b204229602077686572653a782d20604160206973206e756d5f6f626a656374735f746f5f64656c657465ec2d206042602069732060706172616d732e73746f726167655f6275636b6574735f6e756d5f7769746e65737360202869662070726f766964656429142d2044423ac02020202d20604f2841202b20422960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e8064656c6574655f766964656f5f6173736574735f61735f6d6f64657261746f721401146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400016c73746f726167655f6275636b6574735f6e756d5f7769746e65737310010c7533320001406173736574735f746f5f72656d6f76654d01016442547265655365743c446174614f626a65637449643c543e3e000124726174696f6e616c6528011c5665633c75383e001028203c7765696768743e002423232057656967687458604f202841202b2042202b204329602077686572653aa42d2060416020697320746865206c656e677468206f6620606173736574735f746f5f72656d6f766560cc2d20604260206973207468652076616c7565206f66206073746f726167655f6275636b6574735f6e756d5f7769746e65737360b42d20604360206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423ac02020202d20604f2841202b20422960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e6464656c6574655f766964656f5f61735f6d6f64657261746f721401146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400016c73746f726167655f6275636b6574735f6e756d5f7769746e657373e501012c4f7074696f6e3c7533323e0001546e756d5f6f626a656374735f746f5f64656c65746520010c753634000124726174696f6e616c6528011c5665633c75383e001128203c7765696768743e002423232057656967687458604f202841202b2042202b204329602077686572653ab42d20604160206973207468652076616c7565206f6620606e756d5f6f626a656374735f746f5f64656c65746560cc2d20604260206973207468652076616c7565206f66206073746f726167655f6275636b6574735f6e756d5f7769746e65737360b42d20604360206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423ac02020202d20604f2841202b20422960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e847365745f766964656f5f7669736962696c6974795f61735f6d6f64657261746f721001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400012469735f68696464656e880110626f6f6c000124726174696f6e616c6528011c5665633c75383e0012282d0145787472696e73696320666f7220766964656f207669736962696c69747920737461747573202868696464656e2f76697369626c65292073657474696e67206279206d6f64657261746f7200203c7765696768743e002423232057656967687438604f20284129602077686572653ab42d20604160206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e587570646174655f6368616e6e656c5f7061796f757473040118706172616d73550201845570646174654368616e6e656c5061796f757473506172616d65746572733c543e00132458557064617465206368616e6e656c207061796f75747300203c7765696768743e002423232057656967687438604f20283129602077686572653a142d2044423a182d204f2831292c23203c2f7765696768743e50636c61696d5f6368616e6e656c5f7265776172640c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e00011470726f6f66090601505665633c50726f6f66456c656d656e743c543e3e0001106974656d1506013850756c6c5061796d656e743c543e001428a0436c61696d2072657761726420696e204a4f592066726f6d206368616e6e656c206163636f756e7400203c7765696768743e002423232057656967687438604f20284829602077686572653ac82d2060486020697320746865206c656e676874206f66207468652070726f7669646564206d65726b6c65206070726f6f6660142d2044423a242020202d204f2831292c23203c2f7765696768743e7477697468647261775f66726f6d5f6368616e6e656c5f62616c616e63650c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964000118616d6f756e7418013042616c616e63654f663c543e001524845769746864726177204a4f592066726f6d206368616e6e656c206163636f756e7400203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e7c7570646174655f6368616e6e656c5f73746174655f626c6f61745f626f6e640401706e65775f6368616e6e656c5f73746174655f626c6f61745f626f6e6418013042616c616e63654f663c543e0016289c55706461746573206368616e6e656c20737461746520626c6f617420626f6e642076616c75652e7c4f6e6c79206c6561642063616e2075706c6f616420746869732076616c756500203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e747570646174655f766964656f5f73746174655f626c6f61745f626f6e640401686e65775f766964656f5f73746174655f626c6f61745f626f6e6418013042616c616e63654f663c543e001728945570646174657320766964656f20737461746520626c6f617420626f6e642076616c75652e7c4f6e6c79206c6561642063616e2075706c6f616420746869732076616c756500203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e84636c61696d5f616e645f77697468647261775f6368616e6e656c5f7265776172640c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e00011470726f6f66090601505665633c50726f6f66456c656d656e743c543e3e0001106974656d1506013850756c6c5061796d656e743c543e001828d4436c61696d20616e642077697468647261772072657761726420696e204a4f592066726f6d206368616e6e656c206163636f756e7400203c7765696768743e002423232057656967687438604f20284829602077686572653ac82d2060486020697320746865206c656e676874206f66207468652070726f7669646564206d65726b6c65206070726f6f6660142d2044423a242020202d204f2831292c23203c2f7765696768743e2469737375655f6e66740c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964000118706172616d73ed0101604e667449737375616e6365506172616d65746572733c543e001930244973737565204e465400203c7765696768743e00242323205765696768742c604f202857202b20422960142d2044423a242020202d204f2857291877686572653a19012020202d2057203a206d656d6265722077686974656c697374206c656e67746820696e2063617365206e667420696e697469616c207374617475732069732061756374696f6ec02020202d2042203a2073697a65206f66206d6574616461746120706172616d6574657220696e206b696c6f62797465732c23203c2f7765696768743e2c64657374726f795f6e66740801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964001a242c44657374726f79204e465400203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e4873746172745f6f70656e5f61756374696f6e0c01206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400013861756374696f6e5f706172616d73e90101504f70656e41756374696f6e506172616d733c543e001b2470537461727420766964656f206e6674206f70656e2061756374696f6e203c7765696768743e002423232057656967687438604f20285729602077686572653a742d2057203a206d656d6265722077686974656c697374206c656e677468142d2044423a242020202d204f2857292c23203c2f7765696768743e5473746172745f656e676c6973685f61756374696f6e0c01206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400013861756374696f6e5f706172616d73e101015c456e676c69736841756374696f6e506172616d733c543e001c247c537461727420766964656f206e667420656e676c6973682061756374696f6e203c7765696768743e002423232057656967687438604f20285729602077686572653a882d2057203a2077686974656c697374206d656d626572206c697374206c656e677468142d2044423a242020202d204f2857292c23203c2f7765696768743e5863616e63656c5f656e676c6973685f61756374696f6e0801206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964001d208043616e63656c20766964656f206e667420656e676c6973682061756374696f6e203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e4c63616e63656c5f6f70656e5f61756374696f6e0801206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964001e207443616e63656c20766964656f206e6674206f70656e2061756374696f6e203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e3063616e63656c5f6f666665720801206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f4964001f244043616e63656c204e6674206f6666657200203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e3863616e63656c5f6275795f6e6f770801206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f49640020245443616e63656c204e66742073656c6c206f7264657200203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f283129243c2f7765696768743e507570646174655f6275795f6e6f775f70726963650c01206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f49640001246e65775f707269636518013042616c616e63654f663c543e0021246055706461746520427579206e6f77206e667420707269636500203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e546d616b655f6f70656e5f61756374696f6e5f6269640c01387061727469636970616e745f696420012c543a3a4d656d6265724964000120766964656f5f6964200128543a3a566964656f49640001286269645f616d6f756e7418013042616c616e63654f663c543e002220404d616b652061756374696f6e20626964203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e606d616b655f656e676c6973685f61756374696f6e5f6269640c01387061727469636970616e745f696420012c543a3a4d656d6265724964000120766964656f5f6964200128543a3a566964656f49640001286269645f616d6f756e7418013042616c616e63654f663c543e002320604d616b6520656e676c6973682061756374696f6e20626964203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e5c63616e63656c5f6f70656e5f61756374696f6e5f6269640801387061727469636970616e745f696420012c543a3a4d656d6265724964000120766964656f5f6964200128543a3a566964656f49640024205c43616e63656c206f70656e2061756374696f6e20626964203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e58736574746c655f656e676c6973685f61756374696f6e040120766964656f5f6964200128543a3a566964656f496400252464436c61696d20776f6e20656e676c6973682061756374696f6e5c43616e2062652063616c6c656420627920616e796f6e65203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e607069636b5f6f70656e5f61756374696f6e5f77696e6e65721001206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400012477696e6e65725f696420012c543a3a4d656d6265724964000118636f6d6d697418013042616c616e63654f663c543e0026245c416363657074206f70656e2061756374696f6e206269648c53686f756c64206f6e6c792062652063616c6c65642062792061756374696f6e656572203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e246f666665725f6e6674100120766964656f5f6964200128543a3a566964656f49640001206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000108746f20012c543a3a4d656d62657249640001147072696365310101504f7074696f6e3c42616c616e63654f663c543e3e002724244f66666572204e667400203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e38736c696e675f6e66745f6261636b080120766964656f5f6964200128543a3a566964656f49640001206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e002824c452657475726e204e6674206261636b20746f20746865206f726967696e616c20617274697374206174206e6f20636f737400203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e546163636570745f696e636f6d696e675f6f66666572080120766964656f5f6964200128543a3a566964656f49640001347769746e6573735f7072696365310101a04f7074696f6e3c3c542061732062616c616e6365733a3a436f6e6669673e3a3a42616c616e63653e0029246441636365707420696e636f6d696e67204e6674206f6666657200203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e2073656c6c5f6e66740c0120766964656f5f6964200128543a3a566964656f49640001206f776e65725f6964890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000114707269636518013042616c616e63654f663c543e002a202053656c6c204e6674203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e1c6275795f6e66740c0120766964656f5f6964200128543a3a566964656f49640001387061727469636970616e745f696420012c543a3a4d656d62657249640001347769746e6573735f707269636518013042616c616e63654f663c543e002b241c427579204e667400203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e44746f67676c655f6e66745f6c696d69747304011c656e61626c6564880110626f6f6c002c20dc4f6e6c7920436f756e63696c2063616e20746f67676c65206e66742069737375616e6365206c696d69747320636f6e73747261696e7473203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e506368616e6e656c5f6f776e65725f72656d61726b0801286368616e6e656c5f6964200130543a3a4368616e6e656c496400010c6d736728011c5665633c75383e002d28504368616e6e656c206f776e65722072656d61726b203c7765696768743e00242323205765696768741c604f2028422960142d2044423a242020202d204f2831291877686572653a8c2d204220697320746865206b696c6f62797465206c656e676874206f6620606d7367602c23203c2f7765696768743e506368616e6e656c5f6167656e745f72656d61726b0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400010c6d736728011c5665633c75383e002e286c4368616e6e656c20636f6c6c61626f7261746f722072656d61726b203c7765696768743e00242323205765696768741c604f2028422960142d2044423a242020202d204f2831291877686572653a8420202d2042206973207468652062797465206c656e676874206f6620606d7367602c23203c2f7765696768743e406e66745f6f776e65725f72656d61726b0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e000120766964656f5f6964200128543a3a566964656f496400010c6d736728011c5665633c75383e002f28404e4654206f776e65722072656d61726b203c7765696768743e00242323205765696768741c604f2028422960142d2044423a2020202d204f2831291877686572653a8420202d2042206973207468652062797465206c656e676874206f6620606d7367602c23203c2f7765696768743e6c696e697469616c697a655f6368616e6e656c5f7472616e736665720c01286368616e6e656c5f6964200130543a3a4368616e6e656c49640001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e00013c7472616e736665725f706172616d731906016c496e69745472616e73666572506172616d65746572734f663c543e003028dc53746172742061206368616e6e656c207472616e736665722077697468207370656369666965642063686172616374657269737469637300203c7765696768743e002423232057656967687438604f20284129602077686572653a25012d2060416020697320746865206e756d626572206f6620656e747269657320696e20607472616e736665725f706172616d732e6e65775f636f6c6c61626f7261746f727360206d6170142d2044423aa82020202d204f284129202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e5c63616e63656c5f6368616e6e656c5f7472616e736665720801286368616e6e656c5f6964200130543a3a4368616e6e656c49640001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0031245c63616e63656c206368616e6e656c207472616e7366657200203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5c6163636570745f6368616e6e656c5f7472616e736665720801286368616e6e656c5f6964200130543a3a4368616e6e656c4964000144636f6d6d69746d656e745f706172616d73510201785472616e73666572436f6d6d69746d656e745769746e6573734f663c543e00322c6441636365707473206368616e6e656c207472616e736665722e310160636f6d6d69746d656e745f706172616d736020697320726571756972656420746f2070726576656e74206368616e67696e6720746865207472616e7366657220636f6e646974696f6e732e00203c7765696768743e002423232057656967687438604f20284129602077686572653a2d012d2060416020697320746865206e756d626572206f6620656e747269657320696e2060636f6d6d69746d656e745f706172616d732e6e65775f636f6c6c61626f7261746f727360206d6170142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5c7570646174655f676c6f62616c5f6e66745f6c696d69740801406e66745f6c696d69745f706572696f646d0201384e66744c696d6974506572696f640001146c696d697420010c753634003320605570646174657320676c6f62616c204e4654206c696d6974203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e607570646174655f6368616e6e656c5f6e66745f6c696d69741001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001406e66745f6c696d69745f706572696f646d0201384e66744c696d6974506572696f640001286368616e6e656c5f6964200130543a3a4368616e6e656c49640001146c696d697420010c7536340034207055706461746573206368616e6e656c2773204e4654206c696d69742e203c7765696768743e00242323205765696768741c604f2028312960142d2044423a242020202d204f2831292c23203c2f7765696768743e4c69737375655f63726561746f725f746f6b656e0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964000118706172616d73ad020170546f6b656e49737375616e6365506172616d65746572734f663c543e0035284c49737375652063726561746f7220746f6b656e00203c7765696768743e002423232057656967687438604f20284129602077686572653a05012d2060416020697320746865206e756d626572206f6620656e747269657320696e2060706172616d732e696e697469616c5f616c6c6f636174696f6e60206d6170142d2044423ab02020202d20604f28412960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e5c696e69745f63726561746f725f746f6b656e5f73616c650c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964000118706172616d731d060150546f6b656e53616c65506172616d734f663c543e00362874496e697469616c697a652063726561746f7220746f6b656e2073616c6500203c7765696768743e002423232057656967687438604f20284129602077686572653a29012d20604160206973207468652073697a65206f662060706172616d732e6d657461646174616020696e206b696c6f627974657320286f722030206966206e6f742070726f766964656429142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e887570646174655f7570636f6d696e675f63726561746f725f746f6b656e5f73616c651001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400013c6e65775f73746172745f626c6f636be50101584f7074696f6e3c543a3a426c6f636b4e756d6265723e0001306e65775f6475726174696f6ee50101584f7074696f6e3c543a3a426c6f636b4e756d6265723e00372488557064617465207570636f6d696e672063726561746f7220746f6b656e2073616c6500203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e7463726561746f725f746f6b656e5f6973737565725f7472616e736665721001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400011c6f757470757473210601645472616e73666572735769746856657374696e674f663c543e0001206d6574616461746128011c5665633c75383e00382cc8506572666f726d207472616e73666572206f6620746f6b656e732061732063726561746f7220746f6b656e2069737375657200203c7765696768743e002423232057656967687448604f202841202b204229602077686572653aac2d2060416020697320746865206e756d626572206f6620656e747269657320696e20606f75747075747360c02d20604260206973207468652073697a65206f662074686520606d657461646174616020696e206b696c6f6279746573142d2044423ab02020202d20604f28412960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e846d616b655f63726561746f725f746f6b656e5f7065726d697373696f6e6c6573730801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964003924ac4d616b65206368616e6e656c27732063726561746f7220746f6b656e207065726d697373696f6e6c65737300203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e987265647563655f63726561746f725f746f6b656e5f706174726f6e6167655f726174655f746f0c01146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c496400012c7461726765745f72617465dd020128596561726c7952617465003a24f0526564756365206368616e6e656c27732063726561746f7220746f6b656e20706174726f6e616765207261746520746f20676976656e2076616c756500203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e90636c61696d5f63726561746f725f746f6b656e5f706174726f6e6167655f6372656469740801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964003b24b8436c61696d206368616e6e656c27732063726561746f7220746f6b656e20706174726f6e6167652063726564697400203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e4c69737375655f726576656e75655f73706c69741001146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c49640001147374617274e50101584f7074696f6e3c543a3a426c6f636b4e756d6265723e0001206475726174696f6e100138543a3a426c6f636b4e756d626572003c2484497373756520726576656e75652073706c697420666f722061206368616e6e656c00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5866696e616c697a655f726576656e75655f73706c69740801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964003d247c46696e616c697a6520616e20656e64656420726576656e75652073706c697400203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6c66696e616c697a655f63726561746f725f746f6b656e5f73616c650801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964003e249046696e616c697a6520616e20656e6465642063726561746f7220746f6b656e2073616c6500203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e54646569737375655f63726561746f725f746f6b656e0801146163746f72890101e8436f6e74656e744163746f723c543a3a43757261746f7247726f757049642c20543a3a43757261746f7249642c20543a3a4d656d62657249643e0001286368616e6e656c5f6964200130543a3a4368616e6e656c4964003f247c44656973737565206368616e6e656c27732063726561746f7220746f6b656e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e05060c3870616c6c65745f636f6e74656e74147479706573444368616e6e656c4261675769746e657373000008014c73746f726167655f6275636b6574735f6e756d10010c753332000160646973747269627574696f6e5f6275636b6574735f6e756d10010c753332000009060000020d06000d060c3470616c6c65745f636f6d6d6f6e2c6d65726b6c655f747265654850726f6f66456c656d656e745265636f726408104861736801241053696465011106000801106861736824011048617368000110736964651106011053696465000011060c3470616c6c65745f636f6d6d6f6e2c6d65726b6c655f747265651053696465000108104c6566740000001452696768740001000015060c3870616c6c65745f636f6e74656e741474797065734850756c6c5061796d656e74456c656d656e740c244368616e6e656c496401201c42616c616e6365011810486173680124000c01286368616e6e656c5f69642001244368616e6e656c496400016063756d756c61746976655f7265776172645f6561726e656418011c42616c616e6365000118726561736f6e24011048617368000019060c3870616c6c65745f636f6e74656e7414747970657358496e69745472616e73666572506172616d65746572730c204d656d626572496401203843757261746f7247726f7570496401201c42616c616e63650118000c01446e65775f636f6c6c61626f7261746f7273110201ac42547265654d61703c4d656d62657249642c204368616e6e656c4167656e745065726d697373696f6e733e000114707269636518011c42616c616e63650001246e65775f6f776e6572c90101984368616e6e656c4f776e65723c4d656d62657249642c2043757261746f7247726f757049643e00001d060c5070616c6c65745f70726f6a6563745f746f6b656e1474797065733c546f6b656e53616c65506172616d7310284a6f7942616c616e636501181c42616c616e636501182c426c6f636b4e756d62657201105456657374696e675363686564756c65506172616d7301b502001c0128756e69745f70726963651801284a6f7942616c616e636500015075707065725f626f756e645f7175616e7469747918011c42616c616e63650001247374617274735f6174e501014c4f7074696f6e3c426c6f636b4e756d6265723e0001206475726174696f6e10012c426c6f636b4e756d62657200015c76657374696e675f7363686564756c655f706172616d73bd0201744f7074696f6e3c56657374696e675363686564756c65506172616d733e0001386361705f7065725f6d656d6265723101013c4f7074696f6e3c42616c616e63653e0001206d657461646174611d01013c4f7074696f6e3c5665633c75383e3e000021060c5070616c6c65745f70726f6a6563745f746f6b656e147479706573245472616e736665727308204d656d626572496401201c5061796d656e7401ed020004002506016c42547265654d61703c4d656d62657249642c205061796d656e743e00002506042042547265654d617008044b0120045601ed02000400290600000029060000022d06002d060000040820ed02003106083870616c6c65745f73746f726167651043616c6c0404540001905464656c6574655f73746f726167655f6275636b657404014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b657449640000201d0144656c6574652073746f72616765206275636b65742e204d75737420626520656d7074792e2053746f72616765206f70657261746f72206d757374206265206d697373696e672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e7c7570646174655f75706c6f6164696e675f626c6f636b65645f7374617475730401286e65775f737461747573880110626f6f6c000120785570646174657320676c6f62616c2075706c6f6164696e6720666c61672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f646174615f73697a655f6665650401446e65775f646174615f73697a655f66656518013042616c616e63654f663c543e000220cc557064617465732073697a652d62617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e907570646174655f73746f726167655f6275636b6574735f7065725f6261675f6c696d69740401246e65775f6c696d697410010c753332000320bc55706461746573202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743ea47570646174655f73746f726167655f6275636b6574735f766f75636865725f6d61785f6c696d6974730801406e65775f6f626a656374735f73697a6520010c7536340001486e65775f6f626a656374735f6e756d62657220010c753634000420b455706461746573202253746f72616765206275636b65747320766f7563686572206d6178206c696d697473222e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e8c7570646174655f646174615f6f626a6563745f73746174655f626c6f61745f626f6e6404014073746174655f626c6f61745f626f6e6418013042616c616e63654f663c543e000520ac557064617465732064617461206f626a65637420737461746520626c6f617420626f6e642076616c75652e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743efc7570646174655f6e756d6265725f6f665f73746f726167655f6275636b6574735f696e5f64796e616d69635f6261675f6372656174696f6e5f706f6c69637908014064796e616d69635f6261675f747970659502013844796e616d6963426167547970650001646e756d6265725f6f665f73746f726167655f6275636b65747310010c7533320006202d01557064617465206e756d626572206f662073746f72616765206275636b657473207573656420696e20676976656e2064796e616d696320626167206372656174696f6e20706f6c6963792e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e407570646174655f626c61636b6c69737408013472656d6f76655f6861736865738902014442547265655365743c5665633c75383e3e0001286164645f6861736865738902014442547265655365743c5665633c75383e3e000728bc41646420616e642072656d6f76652068617368657320746f207468652063757272656e7420626c61636b6c6973742e203c7765696768743e002423232057656967687448604f202857202b205629602077686572653abc2d2060576020697320746865206e756d626572206f66206974656d7320696e206072656d6f76655f68617368657360b02d2060566020697320746865206e756d626572206f66206974656d7320696e20606164645f68617368657360142d2044423ab02020202d20604f28572960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e546372656174655f73746f726167655f6275636b6574100134696e766974655f776f726b65722101014c4f7074696f6e3c576f726b657249643c543e3e000148616363657074696e675f6e65775f62616773880110626f6f6c00012873697a655f6c696d697420010c7536340001346f626a656374735f6c696d697420010c753634000820584372656174652073746f72616765206275636b65742e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e787570646174655f73746f726167655f6275636b6574735f666f725f6261670c01186261675f69647902012042616749643c543e00012c6164645f6275636b6574734d01017042547265655365743c543a3a53746f726167654275636b657449643e00013872656d6f76655f6275636b6574734d01017042547265655365743c543a3a53746f726167654275636b657449643e00092888557064617465732073746f72616765206275636b65747320666f722061206261672e203c7765696768743e002423232057656967687448604f202857202b205629602077686572653ab42d2060576020697320746865206e756d626572206f66206974656d7320696e20606164645f6275636b65747360c02d2060566020697320746865206e756d626572206f66206974656d7320696e206072656d6f76655f6275636b65747360142d2044423ac02020202d20604f2856202b20572960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e9463616e63656c5f73746f726167655f6275636b65745f6f70657261746f725f696e7669746504014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b65744964000a20110143616e63656c2070656e64696e672073746f72616765206275636b657420696e766974652e20416e20696e7669746174696f6e206d7573742062652070656e64696e672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e78696e766974655f73746f726167655f6275636b65745f6f70657261746f7208014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b6574496400012c6f70657261746f725f696420012c576f726b657249643c543e000b20c0496e766974652073746f72616765206275636b6574206f70657261746f722e204d757374206265206d697373696e672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e7872656d6f76655f73746f726167655f6275636b65745f6f70657261746f7204014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b65744964000c208052656d6f7665732073746f72616765206275636b6574206f70657261746f722e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e707570646174655f73746f726167655f6275636b65745f73746174757308014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b65744964000148616363657074696e675f6e65775f62616773880110626f6f6c000d20dc5570646174652077686574686572206e6577206261677320617265206265696e6720616363657074656420666f722073746f726167652e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e847365745f73746f726167655f6275636b65745f766f75636865725f6c696d6974730c014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b657449640001586e65775f6f626a656374735f73697a655f6c696d697420010c7536340001606e65775f6f626a656374735f6e756d6265725f6c696d697420010c753634000e208c536574732073746f72616765206275636b657420766f7563686572206c696d6974732e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e806163636570745f73746f726167655f6275636b65745f696e7669746174696f6e0c0124776f726b65725f696420012c576f726b657249643c543e00014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b657449640001547472616e736163746f725f6163636f756e745f6964000130543a3a4163636f756e744964000f285d01416363657074207468652073746f72616765206275636b657420696e7669746174696f6e2e20416e20696e7669746174696f6e206d757374206d617463682074686520776f726b65725f696420706172616d657465722e59014974206163636570747320616e206164646974696f6e616c206163636f756e7420494420287472616e736163746f722920666f7220616363657074696e672064617461206f626a6563747320746f2070726576656e74747472616e73616374696f6e206e6f6e636520636f6c6c6973696f6e732e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e747365745f73746f726167655f6f70657261746f725f6d657461646174610c0124776f726b65725f696420012c576f726b657249643c543e00014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b657449640001206d6574616461746128011c5665633c75383e001024dc536574732073746f72616765206f70657261746f72206d65746164617461202865672e3a2073746f72616765206e6f64652055524c292e203c7765696768743e002423232057656967687438604f20285729602077686572653aa02d206057602069732073697a65206f6620606d657461646174616020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6c6163636570745f70656e64696e675f646174615f6f626a65637473100124776f726b65725f696420012c576f726b657249643c543e00014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b657449640001186261675f69647902012042616749643c543e000130646174615f6f626a656374734d01016442547265655365743c543a3a446174614f626a65637449643e0011246501412073746f726167652070726f7669646572207369676e616c732074686174207468652064617461206f626a65637420776173207375636365737366756c6c792075706c6f6164656420746f206974732073746f726167652e203c7765696768743e00242323205765696768743c604f2028572029602077686572653ab82d2060576020697320746865206e756d626572206f66206974656d7320696e2060646174615f6f626a6563747360142d2044423ab02020202d20604f28572960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e846372656174655f646973747269627574696f6e5f6275636b65745f66616d696c7900122090437265617465206120646973747269627574696f6e206275636b65742066616d696c792e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e8464656c6574655f646973747269627574696f6e5f6275636b65745f66616d696c7904012466616d696c795f6964200174543a3a446973747269627574696f6e4275636b657446616d696c7949640013209444656c65746573206120646973747269627574696f6e206275636b65742066616d696c792e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e686372656174655f646973747269627574696f6e5f6275636b657408012466616d696c795f6964200174543a3a446973747269627574696f6e4275636b657446616d696c794964000148616363657074696e675f6e65775f62616773880110626f6f6c00142074437265617465206120646973747269627574696f6e206275636b65742e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e847570646174655f646973747269627574696f6e5f6275636b65745f7374617475730801246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e000148616363657074696e675f6e65775f62616773880110626f6f6c001520d855706461746573206120646973747269627574696f6e206275636b6574202761636365707473206e657720626167732720666c61672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6864656c6574655f646973747269627574696f6e5f6275636b65740401246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e001620a844656c65746520646973747269627574696f6e206275636b65742e204d75737420626520656d7074792e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e8c7570646174655f646973747269627574696f6e5f6275636b6574735f666f725f6261671001186261675f69647902012042616749643c543e00012466616d696c795f6964200174543a3a446973747269627574696f6e4275636b657446616d696c79496400014c6164645f6275636b6574735f696e64696365734d01019042547265655365743c543a3a446973747269627574696f6e4275636b6574496e6465783e00015872656d6f76655f6275636b6574735f696e64696365734d01019042547265655365743c543a3a446973747269627574696f6e4275636b6574496e6465783e0017289c5570646174657320646973747269627574696f6e206275636b65747320666f722061206261672e203c7765696768743e002423232057656967687448604f202857202b205629602077686572653ad42d2060576020697320746865206e756d626572206f66206974656d7320696e20606164645f6275636b6574735f696e646963657360e02d2060566020697320746865206e756d626572206f66206974656d7320696e206072656d6f76655f6275636b6574735f696e646963657360142d2044423ac02020202d20604f2856202b20572960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743ea47570646174655f646973747269627574696f6e5f6275636b6574735f7065725f6261675f6c696d69740401246e65775f6c696d697410010c753332001820d0557064617465732022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e7c7570646174655f646973747269627574696f6e5f6275636b65745f6d6f64650801246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e000130646973747269627574696e67880110626f6f6c001920d8557064617465732027646973747269627574696e672720666c616720666f722074686520646973747269627574696e6720666c61672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743eb87570646174655f66616d696c6965735f696e5f64796e616d69635f6261675f6372656174696f6e5f706f6c69637908014064796e616d69635f6261675f747970659502013844796e616d69634261675479706500012066616d696c696573990201b042547265654d61703c543a3a446973747269627574696f6e4275636b657446616d696c7949642c207533323e001a283d01557064617465206e756d626572206f66206469737472696275746564206275636b657473207573656420696e20676976656e2064796e616d696320626167206372656174696f6e20706f6c6963792e9c5570646174657320646973747269627574696f6e206275636b65747320666f722061206261672e203c7765696768743e002423232057656967687438604f20285729602077686572653aa82d2060576020697320746865206e756d626572206f66206974656d7320696e206066616d696c69657360142d2044423ab02020202d20604f28572960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e8c696e766974655f646973747269627574696f6e5f6275636b65745f6f70657261746f720801246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e0001486f70657261746f725f776f726b65725f696420012c576f726b657249643c543e001b2090496e7669746520616e206f70657261746f722e204d757374206265206d697373696e672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743ea863616e63656c5f646973747269627574696f6e5f6275636b65745f6f70657261746f725f696e766974650801246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e0001486f70657261746f725f776f726b65725f696420012c576f726b657249643c543e001c209c43616e63656c2070656e64696e6720696e766974652e204d7573742062652070656e64696e672e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e8c72656d6f76655f646973747269627574696f6e5f6275636b65745f6f70657261746f720801246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e0001486f70657261746f725f776f726b65725f696420012c576f726b657249643c543e001d209452656d6f76657320646973747269627574696f6e206275636b6574206f70657261746f722e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e9c7365745f646973747269627574696f6e5f6275636b65745f66616d696c795f6d6574616461746108012466616d696c795f6964200174543a3a446973747269627574696f6e4275636b657446616d696c7949640001206d6574616461746128011c5665633c75383e001e24a053657420646973747269627574696f6e206275636b65742066616d696c79206d657461646174612e203c7765696768743e002423232057656967687438604f20285729602077686572653aa02d206057602069732073697a65206f6620606d657461646174616020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e946163636570745f646973747269627574696f6e5f6275636b65745f696e7669746174696f6e080124776f726b65725f696420012c576f726b657249643c543e0001246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e001f20584163636570742070656e64696e6720696e766974652e203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e887365745f646973747269627574696f6e5f6f70657261746f725f6d657461646174610c0124776f726b65725f696420012c576f726b657249643c543e0001246275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e0001206d6574616461746128011c5665633c75383e002024fc53657420646973747269627574696f6e206f70657261746f72206d6574616461746120666f722074686520646973747269627574696f6e206275636b65742e203c7765696768743e002423232057656967687438604f20285729602077686572653aa02d206057602069732073697a65206f6620606d657461646174616020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e607375646f5f75706c6f61645f646174615f6f626a65637473040118706172616d737502014c55706c6f6164506172616d65746572733c543e002104a855706c6f6164206e65772064617461206f626a656374732e20446576656c6f706d656e74206d6f64652e5c73746f726167655f6f70657261746f725f72656d61726b0c0124776f726b65725f696420012c576f726b657249643c543e00014473746f726167655f6275636b65745f6964200148543a3a53746f726167654275636b6574496400010c6d736728011c5665633c75383e0022249c43726561746520612064796e616d6963206261672e20446576656c6f706d656e74206d6f64652e203c7765696768743e002423232057656967687438604f20285729602077686572653a9c2d206057602069732073697a65206f6620606d6573736167656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e70646973747269627574696f6e5f6f70657261746f725f72656d61726b0c0124776f726b65725f696420012c576f726b657249643c543e000158646973747269627574696f6e5f6275636b65745f69640902015c446973747269627574696f6e4275636b657449643c543e00010c6d736728011c5665633c75383e0023249c43726561746520612064796e616d6963206261672e20446576656c6f706d656e74206d6f64652e203c7765696768743e002423232057656967687438604f20285729602077686572653a9c2d206057602069732073697a65206f6620606d6573736167656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e3506085070616c6c65745f70726f6a6563745f746f6b656e1043616c6c04045400011c207472616e736665721001347372635f6d656d6265725f696420012c543a3a4d656d6265724964000120746f6b656e5f6964200128543a3a546f6b656e496400011c6f757470757473390601385472616e73666572734f663c543e0001206d6574616461746128011c5665633c75383e0000685501416c6c6f7720746f207472616e736665722066726f6d20607372635f6d656d6265725f696460206163636f756e7420746f2074686520766172696f757320606f757470757473602062656e6566696369617269657364696e207468652073706563696669656420616d6f756e74732e0038507265636f6e646974696f6e733ae82d206f726967696e207369676e6572206d75737420626520607372635f6d656d6265725f69646020636f6e74726f6c6c6572206163636f756e74842d20746f6b656e2062792060746f6b656e5f696460206d75737420657869737473d82d206163636f756e74206f6620607372635f6d656d6265725f696460206d75737420657869737420666f722060746f6b656e5f69646041012d2073656e646572206d757374206861766520656e6f756768204a4f597320746f20636f7665722074686520746f74616c20626c6f617420626f6e6420726571756972656420696e2063617365206f6678202064657374696e6174696f6e287329206e6f74206578697374696e672e29012d20736f75726365206163636f756e74206d757374206861766520656e6f75676820746f6b656e2066756e647320746f20636f76657220616c6c20746865207472616e7366657228732941012d20606f75747075747360206d7573742064657369676e617465206578697374696e672064657374696e6174696f6e28732920666f7220225065726d697373696f6e656422207472616e73666572732e3c506f7374636f6e646974696f6e733ae82d20736f75726365206163636f756e74277320746f6b656e7320616d6f756e74206973206465637265617365642062792060616d6f756e74602e49012d20746f74616c20626c6f617420626f6e64207472616e736665727265642066726f6d2073656e6465722773204a4f592062616c616e636520696e746f20746865207472656173757279206163636f756e74cc2020696e20636173652064657374696e6174696f6e2873292068617665206265656e20616464656420746f2073746f72616765ec2d20606f7574707574732e62656e65666963696172796020746f6b656e7320616d6f756e7420696e637265617365642062792060616d6f756e746000203c7765696768743e002423232057656967687448604f202854202b204d29602077686572653a802d2060546020697320746865206c656e677468206f6620606f75747075747360b02d20604d60206973207468652073697a65206f6620606d657461646174616020696e206b696c6f6279746573142d2044423aac20202d20604f28542960202d2066726f6d20746865207468652067656e65726174656420776569676874732c23203c2f7765696768743e106275726e0c0120746f6b656e5f6964200128543a3a546f6b656e49640001246d656d6265725f696420012c543a3a4d656d6265724964000118616d6f756e74180144546f6b656e42616c616e63654f663c543e000178884275726e20746f6b656e732066726f6d20737065636966696564206163636f756e740038507265636f6e646974696f6e733a442d2060616d6f756e7460206973203e2030f42d206f726967696e207369676e6572206973206120636f6e74726f6c6c6572206163636f756e74206f6620606d656d6265725f696460206d656d626572702d20746f6b656e2062792060746f6b656e5f69646020657869737473c02d20616e206163636f756e742065786973747320666f722060746f6b656e5f696460207820606d656d6265725f696460a02d206163636f756e74277320746f6b656e7320616d6f756e74206973203e3d2060616d6f756e746005012d20746f6b656e20737570706c792063616e206265206d6f64696669656420287468657265206973206e6f2061637469766520726576656e75652073706c697429003c506f7374636f6e646974696f6e733a4d012d207374617274696e6720776974682060756e70726f6365737365646020626565696e6720657175616c20746f2060616d6f756e74602c206163636f756e7427732076657374696e67207363686564756c6573602020617265206974657261746564206f76657220616e643a5d0120202d2075706461746564207769746820606275726e65645f616d6f756e74202b3d207570726f636573736564602069662076657374696e67207363686564756c65277320756e76657374656420616d6f756e74206973742020202067726561746572207468616e20607570726f636573736564605420202d2072656d6f766564206f746865727769736545012020286166746572206561636820697465726174696f6e2060756e70726f6365737365646020697320726564756365642062792074686520616d6f756e74206f6620756e76657374656420746f6b656e737c20206275726e656420647572696e67207468617420697465726174696f6e2949012d20696620746865206163636f756e742068617320616e79206073706c69745f7374616b696e675f737461747573602c20746865206073706c69745f7374616b696e675f7374617475732e616d6f756e7460e820206973207265647563656420627920606d696e28616d6f756e742c2073706c69745f7374616b696e675f7374617475732e616d6f756e742960a42d20606163636f756e742e616d6f756e746020697320726564756365642062792060616d6f756e7460942d20746f6b656e20737570706c7920697320726564756365642062792060616d6f756e746000203c7765696768743e00242323205765696768741c604f2028312960142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e30647573745f6163636f756e74080120746f6b656e5f6964200128543a3a546f6b656e49640001246d656d6265725f696420012c543a3a4d656d62657249640002508c416c6c6f7720616e79207573657220746f2072656d6f766520616e206163636f756e740038507265636f6e646974696f6e733a802d20746f6b656e2062792060746f6b656e5f696460206d757374206578697374d02d20616e206163636f756e74206d75737420657869737420666f722060746f6b656e5f696460207820606d656d6265725f69646015012d206966205065726d697373696f6e656420746f6b656e3a20606f726967696e60207369676e6572206d75737420626520606d656d6265725f696460206d656d6265722773502020636f6e74726f6c6c6572206163636f756e74ec2d2060746f6b656e5f696460207820606d656d6265725f696460206163636f756e74206d75737420626520616e20656d707479206163636f756e7478202028606163636f756e745f646174612e616d6f756e7460203d3d2030293c506f7374636f6e646974696f6e733a1d012d204163636f756e7420696e666f726d6174696f6e20666f722060746f6b656e5f696460207820606d656d6265725f6964602072656d6f7665642066726f6d2073746f72616765dc2d20626c6f617420626f6e6420726566756e64656420746f20606d656d6265725f69646020636f6e74726f6c6c6572206163636f756e74cc2020286f722060626c6f61745f626f6e642e72657061796d656e745f726573747269637465645f746f60206163636f756e742900203c7765696768743e001c604f2028312960142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e386a6f696e5f77686974656c6973740c01246d656d6265725f696420012c543a3a4d656d6265724964000120746f6b656e5f6964200128543a3a546f6b656e496400011470726f6f664d0601404d65726b6c6550726f6f664f663c543e00034c11014a6f696e2077686974656c69737420666f72207065726d697373696f6e656420636173653a207573656420746f20616464206163636f756e747320666f7220746f6b656e38507265636f6e646974696f6e733a682d2027746f6b656e5f696427206d7573742062652076616c6964f42d20606f726967696e60207369676e6572206d757374206265206120636f6e74726f6c6c6572206163636f756e74206f6620606d656d6265725f696460c02d206163636f756e7420666f7220606d656d6265725f696460206d757374206e6f7420616c726561647920657869737409012d207472616e7366657220706f6c69637920697320605065726d697373696f6e65646020616e64206d65726b6c652070726f6f66206d7573742062652076616c6964003c506f7374636f6e646974696f6e733af42d206163636f756e7420666f7220606d656d6265725f696460206372656174656420616e6420616464656420746f2070616c6c65742073746f72616765e82d2060626c6f61745f626f6e6460207472616e736665727265642066726f6d2073656e64657220746f207472656173757279206163636f756e7400203c7765696768743e002423232057656967687438604f20284829602077686572653a802d2060486020697320746865206c656e677468206f66206070726f6f662e3060142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5c70757263686173655f746f6b656e735f6f6e5f73616c650c0120746f6b656e5f6964200128543a3a546f6b656e49640001246d656d6265725f696420012c543a3a4d656d6265724964000118616d6f756e74180144546f6b656e42616c616e63654f663c543e0004ec94507572636861736520746f6b656e73206f6e2061637469766520746f6b656e2073616c652e0038507265636f6e646974696f6e733a802d20746f6b656e2062792060746f6b656e5f696460206d757374206578697374d02d20746f6b656e2062792060746f6b656e5f696460206d75737420626520696e204f66666572696e6753746174653a3a53616c65ec2d2060616d6f756e74602063616e6e6f7420657863656564206e756d626572206f6620746f6b656e732072656d61696e696e67206f6e2073616c6509012d20606f726967696e60207369676e6572206d75737420626520636f6e74726f6c6c6572206163636f756e74206f6620606d656d6265725f696460206d656d626572a42d2073656e646572277320617661696c61626c65204a4f592062616c616e6365206d7573742062653aec20202d203e3d20606a6f795f6578697374656e7469616c5f6465706f736974202b20616d6f756e74202a2073616c652e756e69745f70726963656080202020206966204163636f756e744461746120616c7265616479206578697374210120202d203e3d20606a6f795f6578697374656e7469616c5f6465706f736974202b20616d6f756e74202a2073616c652e756e69745f7072696365202b20626c6f61745f626f6e646084202020206966204163636f756e744461746120646f6573206e6f7420657869737435012d206c657420606665655f616d6f756e7460206265206073616c655f706c6174666f726d5f6665652e6d756c5f666c6f6f7228616d6f756e74202a2073616c652e756e69745f7072696365296059012d206966206073616c652e6561726e696e67735f64657374696e6174696f6e2e69735f736f6d6528296020616e64206073616c652e6561726e696e67735f64657374696e6174696f6e60206163636f756e74206861733c20207a65726f2062616c616e63653a390120202d2074686520616d6f756e7420746f206265207472616e736665727265642066726f6d206073656e6465726020746f206073616c652e6561726e696e67735f64657374696e6174696f6e602c4d0120202020776869636820697320657175616c20746f2060616d6f756e74202a2073616c652e756e69745f7072696365202d206665655f616d6f756e74602c206d7573742062652067726561746572207468616e7420202020606a6f795f6578697374656e7469616c5f6465706f7369746031012d20746f74616c206e756d626572206f6620746f6b656e7320616c72656164792070757263686173656420627920746865206d656d626572206f6e207468652063757272656e742073616c65f82020504c55532060616d6f756e7460206d757374206e6f74206578636565642073616c6527732070757263686173652063617020706572206d656d626572602d206966205065726d697373696f6e656420746f6b656e3a010120202d204163636f756e74496e666f4279546f6b656e416e644d656d62657228746f6b656e5f69642c20266d656d6265725f696429206d7573742065786973749c2d206966206073616c652e76657374696e675f7363686564756c652e69735f736f6d652829603ae020202d206e756d626572206f662073656e646572206163636f756e742773206f6e676f696e672076657374696e67207363686564756c6573cc202020206d757374206265203c204d617856657374696e675363686564756c65735065724163636f756e74506572546f6b656e003c506f7374636f6e646974696f6e733aac2d206966206073616c652e6561726e696e67735f64657374696e6174696f6e2e69735f736f6d652829603a4d0120202d2060616d6f756e74202a2073616c652e756e69745f7072696365202d206665655f616d6f756e7460204a4f5920746f6b656e7320617265207472616e7366657265642066726f6d206073656e646572608820202020746f206073616c652e6561726e696e67735f64657374696e6174696f6e60d420202d20606665655f616d6f756e7460204a4f5920697320736c61736865642066726f6d206073656e646572602062616c616e6365ac2d206966206073616c652e6561726e696e67735f64657374696e6174696f6e2e69735f6e6f6e652829603a0d0120202d2060616d6f756e74202a2073616c652e756e69745f707269636560204a4f5920697320736c61736865642066726f6d206073656e646572602062616c616e636549012d206966206e657720746f6b656e206163636f756e7420637265617465643a2060626c6f61745f626f6e6460207472616e736665727265642066726f6d206073656e6465726020746f2074726561737572799c2d206966206073616c652e76657374696e675f7363686564756c652e69735f736f6d652829603a0d0120202d20696620627579657220686173206e6f206076657374696e675f7363686564756c65602072656c6174656420746f207468652063757272656e742073616c653a5d01202020202d2061206e65772076657374696e67207363686564756c6520286073616c652e6765745f76657374696e675f7363686564756c652870757263686173655f616d6f756e7429602920697320616464656420746f80202020202020627579657227732060766573696e675f7363686564756c6573605501202020202d20736f6d652066696e69736865642076657374696e67207363686564756c652069732072656d6f7665642066726f6d2062757965722773206163636f756e745f6461746120696e20636173652074686559012020202020206e756d626572206f6620627579657227732076657374696e675f7363686564756c657320776173203d3d204d617856657374696e675363686564756c65735065724163636f756e74506572546f6b656e290120202d20696620627579657220616c7265616479206861732061206076657374696e675f7363686564756c65602072656c6174656420746f207468652063757272656e742073616c653afc202020202d2063757272656e742076657374696e67207363686564756c6527732060636c6966665f616d6f756e746020697320696e63726561736564206279fc2020202020206073616c652e6765745f76657374696e675f7363686564756c652870757263686173655f616d6f756e74292e636c6966665f616d6f756e74602901202020202d2063757272656e742076657374696e67207363686564756c6527732060706f73745f636c6966665f746f74616c5f616d6f756e746020697320696e6372656173656420627929012020202020206073616c652e6765745f76657374696e675f7363686564756c652870757263686173655f616d6f756e74292e706f73745f636c6966665f746f74616c5f616d6f756e74609c2d206966206073616c652e76657374696e675f7363686564756c652e69735f6e6f6e652829603ad820202d2062757965722773206163636f756e7420746f6b656e20616d6f756e7420696e637265617365642062792060616d6f756e746055012d2069662060746f6b656e5f646174612e73616c652e7175616e746974795f6c656674202d20616d6f756e74203d3d20306020616e64206073616c652e6175746f5f66696e616c697a6560206973206074727565604101202060746f6b656e5f646174612e73616c65602069732073657420746f204e6f6e652c206f74686572776973652060746f6b656e5f646174612e73616c652e7175616e746974795f6c65667460206973350120206465637265617365642062792060616d6f756e746020616e642060746f6b656e5f646174612e73616c652e66756e64735f636f6c6c65637465646020696e20696e6372656173656420627970202060616d6f756e74202a2073616c652e756e69745f70726963656000203c7765696768743e00242323205765696768741c604f2028312960142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5070617274696369706174655f696e5f73706c69740c0120746f6b656e5f6964200128543a3a546f6b656e49640001246d656d6265725f696420012c543a3a4d656d6265724964000118616d6f756e74180144546f6b656e42616c616e63654f663c543e000568f0506172746963697061746520696e20746865202a6c61746573742a20746f6b656e20726576656e75652073706c697420286966206f6e676f696e672938507265636f6e646974696f6e733a8c2d2060746f6b656e60206d75737420657869737420666f722060746f6b656e5f696460fc2d20606f726967696e60207369676e6572206d75737420626520606d656d6265725f696460206d656d62657220636f6e74726f6c6c6572206163636f756e74582d2060616d6f756e7460206d757374206265203e2030cc2d20606163636f756e7460206d7573742065786973742020666f72206028746f6b656e5f69642c206d656d6265725f69642960fc2d2060746f6b656e2e73706c69745f73746174757360206d7573742062652061637469766520414e44205448454e2063757272656e745f626c6f636b20696eb82020205b73706c69742e73746172742c2073706c69742e7374617274202b2073706c69745f6475726174696f6e2981012d20606163636f756e742e7374616b696e675f7374617475732e69735f6e6f6e65282960204f5220606163636f756e742e7374616b696e675f7374617475732e73706c69745f6964602072656665727320746f206120706173742073706c6974782d20606163636f756e742e616d6f756e7460203e3d2060616d6f756e74602d012d206c657420606469766964656e64203d2073706c69745f616c6c6f636174696f6e202a206163636f756e742e7374616b65645f616d6f756e74202f20746f6b656e2e737570706c79606015012020207468656e2060747265617375727960206d7573742062652061626c6520746f207472616e7366657220606469766964656e646020616d6f756e74206f66204a4f592eec202020285468697320636f6e646974696f6e20746563686e6963616c6c792c2073686f756c6420616c7761797320626520736174697366696564290038506f7374636f6e646974696f6e732d012d20606469766964656e646020616d6f756e74206f66204a4f5973207472616e736665727265642066726f6d206074726561737572795f6163636f756e746020746f206073656e6465726045012d2060746f6b656e6020726576656e75652073706c6974206469766964656e647320706179656420747261636b696e67207661726961626c6520696e6372656173656420627920606469766964656e646045012d20606163636f756e742e7374616b696e675f737461747573602073657420746f20536f6d65282e2e2920776974682060616d6f756e746020616e642060746f6b656e2e6c61746573745f73706c69746000203c7765696768743e00242323205765696768741c604f2028312960142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e48657869745f726576656e75655f73706c6974080120746f6b656e5f6964200128543a3a546f6b656e49640001246d656d6265725f696420012c543a3a4d656d626572496400064cb453706c69742d70617274696369706174696e672075736572206c656176657320726576656e75652073706c697434507265636f6e646974696f6e738c2d2060746f6b656e60206d75737420657869737420666f722060746f6b656e5f696460fc2d20606f726967696e60207369676e6572206d75737420626520606d656d6265725f696460206d656d62657220636f6e74726f6c6c6572206163636f756e74c82d20606163636f756e7460206d75737420657869737420666f72206028746f6b656e5f69642c206d656d6265725f69642960902d20606163636f756e742e7374616b696e67207374617475732e69735f736f6d6528292729012d2069662060286163636f756e742e7374616b696e675f7374617475732e73706c69745f6964203d3d20746f6b656e2e6e6578745f726576656e75655f73706c69745f6964202d2031604101202020414e442060746f6b656e2e726576656e75655f73706c6974602069732061637469766529205448454e2073706c6974207374616b696e6720706572696f6420206d75737420626520656e6465640038506f7374636f6e646974696f6e73982d20606163636f756e742e7374616b696e675f737461747573602073657420746f204e6f6e6500203c7765696768743e00242323205765696768741c604f2028312960142d2044423ad820202d20604f28312960202d20646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e39060c5070616c6c65745f70726f6a6563745f746f6b656e147479706573245472616e736665727308204d656d626572496401201c5061796d656e74013d060004004106016c42547265654d61703c4d656d62657249642c205061796d656e743e00003d060c5070616c6c65745f70726f6a6563745f746f6b656e1474797065731c5061796d656e74041c42616c616e6365011800040118616d6f756e7418011c42616c616e636500004106042042547265654d617008044b01200456013d0600040045060000004506000002490600490600000408203d06004d060c5070616c6c65745f70726f6a6563745f746f6b656e1474797065732c4d65726b6c6550726f6f660418486173686572012904000400510601845665633c284861736865723a3a4f75747075742c204d65726b6c6553696465293e000051060000025506005506000004082459060059060c5070616c6c65745f70726f6a6563745f746f6b656e147479706573284d65726b6c6553696465000108145269676874000000104c656674000100005d06085c70616c6c65745f70726f706f73616c735f656e67696e651043616c6c04045400011010766f7465100120766f7465725f696420012c4d656d62657249643c543e00012c70726f706f73616c5f6964100134543a3a50726f706f73616c4964000110766f746521030120566f74654b696e64000124726174696f6e616c6528011c5665633c75383e000028d4566f74652065787472696e7369632e20436f6e646974696f6e733a20206f726967696e206d75737420616c6c6f7720766f7465732e00203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f722070617261656d746572732c23203c2f7765696768743e3c63616e63656c5f70726f706f73616c08012c70726f706f7365725f696420012c4d656d62657249643c543e00012c70726f706f73616c5f6964100134543a3a50726f706f73616c4964000128ac43616e63656c20612070726f706f73616c20627920697473206f726967696e616c2070726f706f7365722e00203c7765696768743e002423232057656967687438604f20284c29602077686572653ac02d20604c602069732074686520746f74616c206e756d626572206f66206c6f636b7320696e206042616c616e63657360142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e347665746f5f70726f706f73616c04012c70726f706f73616c5f6964100134543a3a50726f706f73616c4964000224785665746f20612070726f706f73616c2e204d75737420626520726f6f742e00203c7765696768743e0024232320576569676874c4604f202831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c70726f706f7365725f72656d61726b0c012c70726f706f73616c5f6964100134543a3a50726f706f73616c496400012c70726f706f7365725f696420012c4d656d62657249643c543e00010c6d736728011c5665633c75383e0003243c50726f706f7365722052656d61726b00203c7765696768743e0024232320576569676874c4604f202831296020646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e6106086c70616c6c65745f70726f706f73616c735f64697363757373696f6e1043616c6c040454000110206164645f706f7374100138706f73745f617574686f725f696420012c4d656d62657249643c543e0001247468726561645f696420012c543a3a54687265616449640001107465787428011c5665633c75383e0001206564697461626c65880110626f6f6c0000289441646473206120706f7374207769746820617574686f72206f726967696e20636865636b2e00203c7765696768743e002423232057656967687438604f20284c29602077686572653aa02d20604c60206973207468652073697a65206f662060746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c64656c6574655f706f737410012864656c657465725f696420012c4d656d62657249643c543e00011c706f73745f6964200124543a3a506f737449640001247468726561645f696420012c543a3a546872656164496400011068696465880110626f6f6c000128510152656d6f766520706f73742066726f6d2073746f726167652c207769746820746865206c61737420706172616d6574657220696e6469636174696e67207768657468657220746f20616c736f206869646520697428696e207468652055492e00203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c7570646174655f706f73740c01247468726561645f696420012c543a3a546872656164496400011c706f73745f6964200124543a3a506f737449640001107465787428011c5665633c75383e0002282d0155706461746573206120706f7374207769746820617574686f72206f726967696e20636865636b2e2055706461746520617474656d707473206e756d626572206973206c696d697465642e00203c7765696768743e002423232057656967687438604f20284c29602077686572653aa02d20604c60206973207468652073697a65206f662060746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e486368616e67655f7468726561645f6d6f64650c01246d656d6265725f696420012c4d656d62657249643c543e0001247468726561645f696420012c543a3a54687265616449640001106d6f6465290301d85468726561644d6f64653c42547265655365743c3c54206173204d656d6265727368697054797065733e3a3a4d656d62657249643e3e0003287c4368616e67657320746872656164207065726d697373696f6e206d6f64652e00203c7765696768743e0024232320576569676874dc604f2028572960206966205468726561644d6f646520697320636c6f7365206f72204f283129206f74686572776973652077686572653ad02d2060576020697320746865206e756d626572206f662077686974656c6973746564206d656d6265727320696e20606d6f646560142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e6506085870616c6c65745f70726f706f73616c735f636f6465781043616c6c0404540001043c6372656174655f70726f706f73616c08016c67656e6572616c5f70726f706f73616c5f706172616d65746572733103017047656e6572616c50726f706f73616c506172616d65746572733c543e00014070726f706f73616c5f64657461696c733503015050726f706f73616c44657461696c734f663c543e000034450143726561746520612070726f706f73616c2c207468652074797065206f662070726f706f73616c20646570656e6473206f6e20746865206070726f706f73616c5f64657461696c73602076617269616e7400203c7765696768743e002423232057656967687458604f202854202b2044202b204929602077686572653a902d2060546020697320746865207469746c652073697a6520696e206b696c6f6279746573a82d2060446020697320746865206465736372697074696f6e2073697a6520696e206b696c6f6279746573e02d20604960206973207468652073697a65206f6620616e7920706172616d6574657220696e206070726f706f73616c5f64657461696c736084202028696e206b696c6f62797465732069662069742773206d6574616461746129142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e6906085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e6d06085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e7106085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e7506085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e7906085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e7d06085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e8106085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e8506085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e8906085070616c6c65745f776f726b696e675f67726f75701043616c6c08045400044900014c2c6164645f6f70656e696e6710012c6465736372697074696f6e28011c5665633c75383e0001306f70656e696e675f747970656103012c4f70656e696e67547970650001307374616b655f706f6c696379450301a45374616b65506f6c6963793c543a3a426c6f636b4e756d6265722c2042616c616e63654f663c543e3e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e00002cc44164642061206a6f62206f70656e696e6720666f72206120726567756c617220776f726b65722f6c65616420726f6c652e490152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20616464206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e002423232057656967687438604f20284429602077686572653abc2d20604460206973207468652073697a65206f6620606465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e406170706c795f6f6e5f6f70656e696e67040104706503016c4170706c794f6e4f70656e696e67506172616d65746572733c543e000128684170706c79206f6e206120776f726b6572206f70656e696e672e002823203c7765696768743e002423232057656967687438604f20284429602077686572653ac42d20604460206973207468652073697a65206f662060702e6465736372697074696f6e6020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3066696c6c5f6f70656e696e670801286f70656e696e675f69642001244f70656e696e6749640001687375636365737366756c5f6170706c69636174696f6e5f6964734d01015c42547265655365743c4170706c69636174696f6e49643e000228ac46696c6c206f70656e696e6720666f722074686520726567756c61722f6c65616420706f736974696f6e2e4d0152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2066696c6c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e2823203c7765696768743e002423232057656967687438604f20284129602077686572653acc2d2060416020697320746865206c656e677468206f6620607375636365737366756c5f6170706c69636174696f6e5f69647360142d2044423a242020202d204f2841292c23203c2f7765696768743e4c7570646174655f726f6c655f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e00014c6e65775f726f6c655f6163636f756e745f6964000130543a3a4163636f756e744964000324150155706461746520746865206173736f63696174656420726f6c65206163636f756e74206f66207468652061637469766520726567756c617220776f726b65722f6c6561642e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e286c656176655f726f6c65080124776f726b65725f696420012c576f726b657249643c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000424904c656176652074686520726f6c65206279207468652061637469766520776f726b65722e2823203c7765696768743e002423232057656967687438604f20285229602077686572653ab42d20605260206973207468652073697a65206f662060726174696f6e616c656020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e387465726d696e6174655f726f6c650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c7479310101504f7074696f6e3c42616c616e63654f663c543e3e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000528a05465726d696e617465207468652061637469766520776f726b657220627920746865206c6561642e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f207465726d696e61746520746865206c656164657220726f6c65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ad82d20605060206973207468652073697a65206070656e616c74792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c736c6173685f7374616b650c0124776f726b65725f696420012c576f726b657249643c543e00011c70656e616c747918013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e00062c7d01536c61736865732074686520726567756c617220776f726b6572207374616b652c2064656d616e64732061206c6561646572206f726967696e2e204e6f206c696d6974732c206e6f20616374696f6e73206f6e207a65726f207374616b652e3d01496620736c617368696e672062616c616e63652067726561746572207468616e20746865206578697374696e67207374616b65202d207374616b6520697320736c617368656420746f207a65726f2e19015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20736c61736820746865206c6561646572207374616b65292e2823203c7765696768743e002423232057656967687438604f20285029602077686572653ae82d20605060206973207468652073697a65206f66206070656e616c6974792e736c617368696e675f746578746020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3864656372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e00073021014465637265617365732074686520726567756c617220776f726b65722f6c656164207374616b6520616e642072657475726e73207468652072656d61696e64657220746f207468653901776f726b6572207374616b696e675f6163636f756e745f69642e2043616e2062652064656372656173656420746f207a65726f2c206e6f20616374696f6e73206f6e207a65726f207374616b652e944163636570747320746865207374616b6520616d6f756e7420746f2064656372656173652e25015265717569726573207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20646563726561736520746865206c6561646572207374616b65292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e38696e6372656173655f7374616b65080124776f726b65725f696420012c576f726b657249643c543e00014c7374616b655f62616c616e63655f64656c746118013042616c616e63654f663c543e0008280501496e637265617365732074686520726567756c617220776f726b65722f6c656164207374616b652c2064656d616e6473206120776f726b6572206f726967696e2e6d014c6f636b7320746f6b656e732066726f6d2074686520776f726b6572207374616b696e675f6163636f756e745f696420657175616c20746f206e6577207374616b652e204e6f206c696d697473206f6e20746865207374616b652e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e5077697468647261775f6170706c69636174696f6e0401386170706c69636174696f6e5f69642001344170706c69636174696f6e4964000924010157697468647261772074686520776f726b6572206170706c69636174696f6e2e2043616e20626520646f6e652062792074686520776f726b6572206f6e6c792e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3863616e63656c5f6f70656e696e670401286f70656e696e675f69642001244f70656e696e674964000a28dc43616e63656c20616e206f70656e696e6720666f722074686520726567756c617220776f726b65722f6c65616420706f736974696f6e2e550152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f2063616e63656c206f70656e696e6720666f7220746865206c656164657220706f736974696f6e292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e287365745f6275646765740401286e65775f62756467657418013042616c616e63654f663c543e000b28a0536574732061206e65772062756467657420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e547570646174655f7265776172645f6163636f756e74080124776f726b65725f696420012c576f726b657249643c543e0001546e65775f7265776172645f6163636f756e745f6964000130543a3a4163636f756e744964000c2469015570646174652074686520726577617264206163636f756e74206173736f6369617465642077697468206120736574207265776172642072656c6174696f6e7368697020666f72207468652061637469766520776f726b65722e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e507570646174655f7265776172645f616d6f756e74080124776f726b65725f696420012c576f726b657249643c543e0001407265776172645f7065725f626c6f636b310101504f7074696f6e3c42616c616e63654f663c543e3e000d28c855706461746520746865207265776172642070657220626c6f636b20666f72207468652061637469766520776f726b65722e310152657175697265207369676e6564206c6561646572206f726967696e206f722074686520726f6f742028746f20757064617465206c656164657227732072657761726420616d6f756e74292e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e3c7365745f7374617475735f7465787404012c7374617475735f746578741d01013c4f7074696f6e3c5665633c75383e3e000e30b4536574732061206e657720737461747573207465787420666f722074686520776f726b696e672067726f75702e54526571756972657320726f6f74206f726967696e2e002823203c7765696768743e002423232057656967687438604f20285329602077686572653a4d012d20605360206973207468652073697a65206f662074686520636f6e74656e7473206f6620607374617475735f746578746020696e206b696c6f6279746573207768656e206974206973206e6f74206e6f6e6500142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e447370656e645f66726f6d5f6275646765740c01286163636f756e745f6964000130543a3a4163636f756e744964000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c651d01013c4f7074696f6e3c5665633c75383e3e000f28a85472616e73666572732073706563696669656420616d6f756e7420746f20616e79206163636f756e742e5c5265717569726573206c6561646572206f726967696e2e002823203c7765696768743e00242323205765696768741c604f2028312960142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e6466756e645f776f726b696e675f67726f75705f6275646765740c01246d656d6265725f696420012c4d656d62657249643c543e000118616d6f756e7418013042616c616e63654f663c543e000124726174696f6e616c6528011c5665633c75383e0010209846756e6420776f726b696e672067726f7570206275646765742062792061206d656d6265722e203c7765696768743e0024232320576569676874c4604f202831296020446f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d6574657273142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e2c6c6561645f72656d61726b04010c6d736728011c5665633c75383e0011284c4c6561642072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e34776f726b65725f72656d61726b080124776f726b65725f696420012c576f726b657249643c543e00010c6d736728011c5665633c75383e00122854576f726b65722072656d61726b206d657373616765002823203c7765696768743e002423232057656967687438604f20284d29602077686572653a9c2d20604d60206973207468652073697a65206f6620606d73676020696e206b696c6f6279746573142d2044423acc2020202d204f28312920646f65736e277420646570656e64206f6e20746865207374617465206f7220706172616d65746572732c23203c2f7765696768743e0c4c446973706174636861626c652063616c6c732e005501456163682076617269616e74206f66207468697320656e756d206d61707320746f206120646973706174636861626c652066756e6374696f6e2066726f6d20746865206173736f636961746564206d6f64756c652e8d0608586a6f7973747265616d5f6e6f64655f72756e74696d65304f726967696e43616c6c65720001081873797374656d0400910601746672616d655f73797374656d3a3a4f726967696e3c52756e74696d653e00000010566f69640400950601110173656c663a3a73705f6170695f68696464656e5f696e636c756465735f636f6e7374727563745f72756e74696d653a3a68696464656e5f696e636c7564653a3a566f69640001000091060c346672616d655f737570706f7274206469737061746368245261774f726967696e04244163636f756e7449640100010c10526f6f74000000185369676e656404000001244163636f756e744964000100104e6f6e65000200009506081c73705f636f726510566f69640001000099060c3870616c6c65745f7574696c6974791870616c6c6574144572726f7204045400010430546f6f4d616e7943616c6c730000045c546f6f206d616e792063616c6c7320626174636865642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909099d0610346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401a106045300000400a50601185665633c543e0000a106000004082d042000a506000002a10600a90610346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540104045300000400ad0601185665633c543e0000ad060000020400b10604184f7074696f6e04045401b5060108104e6f6e6500000010536f6d650400b5060000010000b5060c4473705f636f6e73656e7375735f626162651c646967657374732450726544696765737400010c1c5072696d6172790400b90601405072696d617279507265446967657374000100385365636f6e64617279506c61696e0400bd06015c5365636f6e64617279506c61696e507265446967657374000200305365636f6e646172795652460400c10601545365636f6e6461727956524650726544696765737400030000b9060c4473705f636f6e73656e7375735f626162651c64696765737473405072696d617279507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7431040110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f669505012056524650726f6f660000bd060c4473705f636f6e73656e7375735f626162651c646967657374735c5365636f6e64617279506c61696e507265446967657374000008013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7431040110536c6f740000c1060c4473705f636f6e73656e7375735f626162651c64696765737473545365636f6e64617279565246507265446967657374000010013c617574686f726974795f696e64657810015473757065723a3a417574686f72697479496e646578000110736c6f7431040110536c6f740001287672665f6f75747075740401245652464f75747075740001247672665f70726f6f669505012056524650726f6f660000c50604184f7074696f6e04045401040108104e6f6e6500000010536f6d650400040000010000c906084473705f636f6e73656e7375735f62616265584261626545706f6368436f6e66696775726174696f6e0000080104635d030128287536342c2075363429000134616c6c6f7765645f736c6f74733d040130416c6c6f776564536c6f74730000cd060c2c70616c6c65745f626162651870616c6c6574144572726f7204045400011060496e76616c696445717569766f636174696f6e50726f6f660000043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c69644b65794f776e65727368697050726f6f66000104310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400020415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e50496e76616c6964436f6e66696775726174696f6e0003048c5375626d697474656420636f6e66696775726174696f6e20697320696e76616c69642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909d106000002d50600d506084470616c6c65745f617574686f727368697038556e636c65456e7472794974656d0c2c426c6f636b4e756d62657201101048617368012418417574686f72010001083c496e636c7573696f6e486569676874040010012c426c6f636b4e756d62657200000014556e636c650800240110486173680000e801384f7074696f6e3c417574686f723e00010000d9060c4470616c6c65745f617574686f72736869701870616c6c6574144572726f7204045400011c48496e76616c6964556e636c65506172656e740000048854686520756e636c6520706172656e74206e6f7420696e2074686520636861696e2e40556e636c6573416c726561647953657400010480556e636c657320616c72656164792073657420696e2074686520626c6f636b2e34546f6f4d616e79556e636c657300020440546f6f206d616e7920756e636c65732e3047656e65736973556e636c650003045454686520756e636c652069732067656e657369732e30546f6f48696768556e636c650004047c54686520756e636c6520697320746f6f206869676820696e20636861696e2e50556e636c65416c7265616479496e636c756465640005047854686520756e636c6520697320616c726561647920696e636c756465642e204f6c64556e636c65000604b454686520756e636c652069736e277420726563656e7420656e6f75676820746f20626520696e636c756465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909dd0610346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401e106045300000400e90601185665633c543e0000e106083c70616c6c65745f62616c616e6365732c42616c616e63654c6f636b041c42616c616e63650118000c01086964050401384c6f636b4964656e746966696572000118616d6f756e7418011c42616c616e636500011c726561736f6e73e506011c526561736f6e730000e506083c70616c6c65745f62616c616e6365731c526561736f6e7300010c0c466565000000104d6973630001000c416c6c00020000e906000002e10600ed0610346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401f106045300000400f50601185665633c543e0000f106083c70616c6c65745f62616c616e6365732c52657365727665446174610844526573657276654964656e7469666965720105041c42616c616e6365011800080108696405040144526573657276654964656e746966696572000118616d6f756e7418011c42616c616e63650000f506000002f10600f906083c70616c6c65745f62616c616e6365732052656c65617365730001081856315f305f300000001856325f305f3000010000fd060c3c70616c6c65745f62616c616e6365731870616c6c6574144572726f720804540004490001203856657374696e6742616c616e63650000049856657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c7565544c69717569646974795265737472696374696f6e73000104c44163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c4c496e73756666696369656e7442616c616e63650002047442616c616e636520746f6f206c6f7720746f2073656e642076616c7565484578697374656e7469616c4465706f736974000304e856616c756520746f6f206c6f7720746f20637265617465206163636f756e742064756520746f206578697374656e7469616c206465706f736974244b656570416c6976650004048c5472616e736665722f7061796d656e7420776f756c64206b696c6c206163636f756e745c4578697374696e6756657374696e675363686564756c65000504c8412076657374696e67207363686564756c6520616c72656164792065786973747320666f722074686973206163636f756e742c446561644163636f756e740006048842656e6566696369617279206163636f756e74206d757374207072652d65786973743c546f6f4d616e795265736572766573000704ac4e756d626572206f66206e616d656420726573657276657320657863656564204d6178526573657276657304ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a09090901070c3473705f61726974686d657469632c66697865645f706f696e7424466978656455313238000004001801107531323800000507086870616c6c65745f7472616e73616374696f6e5f7061796d656e742052656c6561736573000108245631416e6369656e74000000085632000100000907089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651450686173650408426e011001100c4f6666000000185369676e656400010020556e7369676e656404000d07012828626f6f6c2c20426e2900020024456d657267656e6379000300000d07000004088810001107089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365345265616479536f6c7574696f6e0404410100000c0120737570706f7274733505012c537570706f7274733c413e00011473636f726529050134456c656374696f6e53636f726500011c636f6d7075746584013c456c656374696f6e436f6d7075746500001507089070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f706861736534526f756e64536e617073686f740404540000080118766f746572731907013c5665633c566f7465724f663c543e3e00011c74617267657473510501445665633c543a3a4163636f756e7449643e000019070000021d07001d070000040c0020210700210710346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540100045300000400510501185665633c543e0000250710346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b012905045601100453000004002907013842547265654d61703c4b2c20563e00002907042042547265654d617008044b012905045601100004002d070000002d070000023107003107000004082905100035070c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f7068617365187369676e6564405369676e65645375626d697373696f6e0c244163636f756e74496401001c42616c616e6365011820536f6c7574696f6e015d040010010c77686f0001244163636f756e74496400011c6465706f73697418011c42616c616e63650001307261775f736f6c7574696f6e59040154526177536f6c7574696f6e3c536f6c7574696f6e3e00012063616c6c5f66656518011c42616c616e6365000039070c9070616c6c65745f656c656374696f6e5f70726f76696465725f6d756c74695f70686173651870616c6c6574144572726f720404540001306850726544697370617463684561726c795375626d697373696f6e000004645375626d697373696f6e2077617320746f6f206561726c792e6c507265446973706174636857726f6e6757696e6e6572436f756e740001048857726f6e67206e756d626572206f662077696e6e6572732070726573656e7465642e6450726544697370617463685765616b5375626d697373696f6e000204905375626d697373696f6e2077617320746f6f207765616b2c2073636f72652d776973652e3c5369676e6564517565756546756c6c0003044901546865207175657565207761732066756c6c2c20616e642074686520736f6c7574696f6e20776173206e6f7420626574746572207468616e20616e79206f6620746865206578697374696e67206f6e65732e585369676e656443616e6e6f745061794465706f73697400040494546865206f726967696e206661696c656420746f2070617920746865206465706f7369742e505369676e6564496e76616c69645769746e657373000504a05769746e657373206461746120746f20646973706174636861626c6520697320696e76616c69642e4c5369676e6564546f6f4d756368576569676874000604b8546865207369676e6564207375626d697373696f6e20636f6e73756d657320746f6f206d756368207765696768743c4f637743616c6c57726f6e67457261000704984f4357207375626d697474656420736f6c7574696f6e20666f722077726f6e6720726f756e645c4d697373696e67536e617073686f744d65746164617461000804a8536e617073686f74206d657461646174612073686f756c6420657869737420627574206469646e27742e58496e76616c69645375626d697373696f6e496e646578000904d06053656c663a3a696e736572745f7375626d697373696f6e602072657475726e656420616e20696e76616c696420696e6465782e3843616c6c4e6f74416c6c6f776564000a04985468652063616c6c206973206e6f7420616c6c6f776564206174207468697320706f696e742e3846616c6c6261636b4661696c6564000b044c5468652066616c6c6261636b206661696c6564040d014572726f72206f66207468652070616c6c657420746861742063616e2062652072657475726e656420696e20726573706f6e736520746f20646973706174636865732e3d07083870616c6c65745f7374616b696e67345374616b696e674c656467657204045400001401147374617368000130543a3a4163636f756e744964000114746f74616cd0013042616c616e63654f663c543e000118616374697665d0013042616c616e63654f663c543e000124756e6c6f636b696e67410701e4426f756e6465645665633c556e6c6f636b4368756e6b3c42616c616e63654f663c543e3e2c204d6178556e6c6f636b696e674368756e6b733e00013c636c61696d65645f72657761726473590501345665633c457261496e6465783e0000410710346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e646564566563080454014507045300000400490701185665633c543e00004507083870616c6c65745f7374616b696e672c556e6c6f636b4368756e6b041c42616c616e636501180008011476616c7565d0011c42616c616e636500010c657261c9030120457261496e646578000049070000024507004d07083870616c6c65745f7374616b696e672c4e6f6d696e6174696f6e7304045400000c011c74617267657473210701ac426f756e6465645665633c543a3a4163636f756e7449642c20543a3a4d61784e6f6d696e6174696f6e733e0001307375626d69747465645f696e100120457261496e64657800012873757070726573736564880110626f6f6c00005107083870616c6c65745f7374616b696e6734416374697665457261496e666f0000080114696e646578100120457261496e64657800011473746172742101012c4f7074696f6e3c7536343e00005507000004081000005907083870616c6c65745f7374616b696e673c457261526577617264506f696e747304244163636f756e744964010000080114746f74616c10012c526577617264506f696e74000128696e646976696475616c5d07018042547265654d61703c4163636f756e7449642c20526577617264506f696e743e00005d07042042547265654d617008044b010004560110000400610700000061070000026507006507000004080010006907083870616c6c65745f7374616b696e671c466f7263696e67000110284e6f74466f7263696e6700000020466f7263654e657700010024466f7263654e6f6e650002002c466f726365416c77617973000300006d070000027107007107083870616c6c65745f7374616b696e6738556e6170706c696564536c61736808244163636f756e74496401001c42616c616e636501180014012476616c696461746f720001244163636f756e74496400010c6f776e18011c42616c616e63650001186f7468657273410501645665633c284163636f756e7449642c2042616c616e6365293e0001247265706f7274657273510501385665633c4163636f756e7449643e0001187061796f757418011c42616c616e636500007507000004089c180079070c3870616c6c65745f7374616b696e6720736c617368696e6734536c617368696e675370616e7300001001287370616e5f696e6465781001245370616e496e6465780001286c6173745f7374617274100120457261496e6465780001486c6173745f6e6f6e7a65726f5f736c617368100120457261496e6465780001147072696f72590501345665633c457261496e6465783e00007d070c3870616c6c65745f7374616b696e6720736c617368696e67285370616e5265636f7264041c42616c616e636501180008011c736c617368656418011c42616c616e6365000120706169645f6f757418011c42616c616e6365000081070000028507008507000004081088008907083870616c6c65745f7374616b696e672052656c65617365730001243456315f305f30416e6369656e740000001856325f305f300001001856335f305f300002001856345f305f300003001856355f305f300004001856365f305f300005001856375f305f300006001856385f305f300007001856395f305f30000800008d07103870616c6c65745f7374616b696e671870616c6c65741870616c6c6574144572726f72040454000164344e6f74436f6e74726f6c6c6572000004644e6f74206120636f6e74726f6c6c6572206163636f756e742e204e6f745374617368000104504e6f742061207374617368206163636f756e742e34416c7265616479426f6e64656400020460537461736820697320616c726561647920626f6e6465642e34416c726561647950616972656400030474436f6e74726f6c6c657220697320616c7265616479207061697265642e30456d7074795461726765747300040460546172676574732063616e6e6f7420626520656d7074792e384475706c6963617465496e646578000504404475706c696361746520696e6465782e44496e76616c6964536c617368496e64657800060484536c617368207265636f726420696e646578206f7574206f6620626f756e64732e40496e73756666696369656e74426f6e6400070c590143616e6e6f74206861766520612076616c696461746f72206f72206e6f6d696e61746f7220726f6c652c20776974682076616c7565206c657373207468616e20746865206d696e696d756d20646566696e65642062793d01676f7665726e616e6365202873656520604d696e56616c696461746f72426f6e646020616e6420604d696e4e6f6d696e61746f72426f6e6460292e20496620756e626f6e64696e67206973207468651501696e74656e74696f6e2c20606368696c6c6020666972737420746f2072656d6f7665206f6e65277320726f6c652061732076616c696461746f722f6e6f6d696e61746f722e304e6f4d6f72654368756e6b730008049043616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b732e344e6f556e6c6f636b4368756e6b000904a043616e206e6f74207265626f6e6420776974686f757420756e6c6f636b696e67206368756e6b732e3046756e646564546172676574000a04c8417474656d7074696e6720746f2074617267657420612073746173682074686174207374696c6c206861732066756e64732e48496e76616c6964457261546f526577617264000b0458496e76616c69642065726120746f207265776172642e68496e76616c69644e756d6265724f664e6f6d696e6174696f6e73000c0478496e76616c6964206e756d626572206f66206e6f6d696e6174696f6e732e484e6f74536f72746564416e64556e69717565000d04804974656d7320617265206e6f7420736f7274656420616e6420756e697175652e38416c7265616479436c61696d6564000e0409015265776172647320666f72207468697320657261206861766520616c7265616479206265656e20636c61696d656420666f7220746869732076616c696461746f722e54496e636f7272656374486973746f72794465707468000f04c0496e636f72726563742070726576696f757320686973746f727920646570746820696e7075742070726f76696465642e58496e636f7272656374536c617368696e675370616e73001004b0496e636f7272656374206e756d626572206f6620736c617368696e67207370616e732070726f76696465642e2042616453746174650011043901496e7465726e616c20737461746520686173206265636f6d6520736f6d65686f7720636f7272757074656420616e6420746865206f7065726174696f6e2063616e6e6f7420636f6e74696e75652e38546f6f4d616e795461726765747300120494546f6f206d616e79206e6f6d696e6174696f6e207461726765747320737570706c6965642e244261645461726765740013043d0141206e6f6d696e6174696f6e207461726765742077617320737570706c69656420746861742077617320626c6f636b6564206f72206f7468657277697365206e6f7420612076616c696461746f722e4043616e6e6f744368696c6c4f74686572001404550154686520757365722068617320656e6f75676820626f6e6420616e6420746875732063616e6e6f74206265206368696c6c656420666f72636566756c6c7920627920616e2065787465726e616c20706572736f6e2e44546f6f4d616e794e6f6d696e61746f72730015084d0154686572652061726520746f6f206d616e79206e6f6d696e61746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e44546f6f4d616e7956616c696461746f72730016084d0154686572652061726520746f6f206d616e792076616c696461746f727320696e207468652073797374656d2e20476f7665726e616e6365206e6565647320746f2061646a75737420746865207374616b696e67b473657474696e677320746f206b656570207468696e6773207361666520666f72207468652072756e74696d652e40436f6d6d697373696f6e546f6f4c6f77001704e0436f6d6d697373696f6e20697320746f6f206c6f772e204d757374206265206174206c6561737420604d696e436f6d6d697373696f6e602e44426f6e64696e6752657374726963746564001804e045787465726e616c207265737472696374696f6e2070726576656e747320626f6e64696e67207769746820676976656e206163636f756e7404ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909099107000002950700950700000408007105009907000004089d0728009d070c1c73705f636f72651863727970746f244b65795479706549640000040038011c5b75383b20345d0000a1070c3870616c6c65745f73657373696f6e1870616c6c6574144572726f7204045400011430496e76616c696450726f6f6600000460496e76616c6964206f776e6572736869702070726f6f662e5c4e6f4173736f63696174656456616c696461746f7249640001049c4e6f206173736f6369617465642076616c696461746f7220494420666f72206163636f756e742e344475706c6963617465644b65790002046452656769737465726564206475706c6963617465206b65792e184e6f4b657973000304a44e6f206b65797320617265206173736f63696174656420776974682074686973206163636f756e742e244e6f4163636f756e7400040419014b65792073657474696e67206163636f756e74206973206e6f74206c6976652c20736f206974277320696d706f737369626c6520746f206173736f6369617465206b6579732e04744572726f7220666f72207468652073657373696f6e2070616c6c65742ea50700000408241000a907083870616c6c65745f6772616e6470612c53746f726564537461746504044e01100110104c6976650000003050656e64696e6750617573650801307363686564756c65645f61741001044e00011464656c61791001044e000100185061757365640002003450656e64696e67526573756d650801307363686564756c65645f61741001044e00011464656c61791001044e00030000ad07083870616c6c65745f6772616e6470614c53746f72656450656e64696e674368616e676508044e0110144c696d697400001001307363686564756c65645f61741001044e00011464656c61791001044e0001406e6578745f617574686f726974696573b107016c426f756e646564417574686f726974794c6973743c4c696d69743e000118666f72636564e50101244f7074696f6e3c4e3e0000b10710346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401ac045300000400a801185665633c543e0000b5070c3870616c6c65745f6772616e6470611870616c6c6574144572726f7204045400011c2c50617573654661696c65640000080501417474656d707420746f207369676e616c204752414e445041207061757365207768656e2074686520617574686f72697479207365742069736e2774206c697665a42865697468657220706175736564206f7220616c72656164792070656e64696e67207061757365292e30526573756d654661696c65640001081101417474656d707420746f207369676e616c204752414e44504120726573756d65207768656e2074686520617574686f72697479207365742069736e277420706175736564a028656974686572206c697665206f7220616c72656164792070656e64696e6720726573756d65292e344368616e676550656e64696e67000204e8417474656d707420746f207369676e616c204752414e445041206368616e67652077697468206f6e6520616c72656164792070656e64696e672e1c546f6f536f6f6e000304bc43616e6e6f74207369676e616c20666f72636564206368616e676520736f20736f6f6e206166746572206c6173742e60496e76616c69644b65794f776e65727368697050726f6f66000404310141206b6579206f776e6572736869702070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e60496e76616c696445717569766f636174696f6e50726f6f660005043101416e2065717569766f636174696f6e2070726f6f662070726f76696465642061732070617274206f6620616e2065717569766f636174696f6e207265706f727420697320696e76616c69642e584475706c69636174654f6666656e63655265706f727400060415014120676976656e2065717569766f636174696f6e207265706f72742069732076616c69642062757420616c72656164792070726576696f75736c79207265706f727465642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909b90710346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e646564566563080454017505045300000400bd0701185665633c543e0000bd07000002750500c10710346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401bc045300000400c50701185665633c543e0000c507000002bc00c90710346672616d655f737570706f727418747261697473106d69736334577261707065724f706171756504045401cd07000800c903000000cd070104540000cd07084070616c6c65745f696d5f6f6e6c696e6564426f756e6465644f70617175654e6574776f726b53746174650c4c506565724964456e636f64696e674c696d697400584d756c746941646472456e636f64696e674c696d697400384164647265737365734c696d6974000008011c706565725f6964d107019c5765616b426f756e6465645665633c75382c20506565724964456e636f64696e674c696d69743e00014865787465726e616c5f616464726573736573d507012d015765616b426f756e6465645665633c5765616b426f756e6465645665633c75382c204d756c746941646472456e636f64696e674c696d69743e2c204164647265737365734c696d69740a3e0000d10710346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401080453000004002801185665633c543e0000d50710346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e64656456656308045401d107045300000400d90701185665633c543e0000d907000002d10700dd070c4070616c6c65745f696d5f6f6e6c696e651870616c6c6574144572726f7204045400010828496e76616c69644b6579000004604e6f6e206578697374656e74207075626c6963206b65792e4c4475706c696361746564486561727462656174000104544475706c696361746564206865617274626561742e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909e1070c2873705f7374616b696e671c6f6666656e6365384f6666656e636544657461696c7308205265706f727465720100204f6666656e64657201c8000801206f6666656e646572c801204f6666656e6465720001247265706f7274657273510501345665633c5265706f727465723e0000e50700000408e02800e90710346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e6465645665630804540124045300000400b90301185665633c543e0000ed070c2c70616c6c65745f7375646f1870616c6c6574144572726f720404540001042c526571756972655375646f0000047c53656e646572206d75737420626520746865205375646f206163636f756e7404644572726f7220666f7220746865205375646f2070616c6c6574f1070c4070616c6c65745f626167735f6c697374106c697374104e6f646508045400044900001401086964000130543a3a4163636f756e74496400011070726576e801504f7074696f6e3c543a3a4163636f756e7449643e0001106e657874e801504f7074696f6e3c543a3a4163636f756e7449643e0001246261675f7570706572200120543a3a53636f726500011473636f7265200120543a3a53636f72650000f5070c4070616c6c65745f626167735f6c697374106c6973740c426167080454000449000008011068656164e801504f7074696f6e3c543a3a4163636f756e7449643e0001107461696ce801504f7074696f6e3c543a3a4163636f756e7449643e0000f9070c4070616c6c65745f626167735f6c6973741870616c6c6574144572726f72080454000449000104104c6973740400fd0701244c6973744572726f72000004b441206572726f7220696e20746865206c69737420696e7465726661636520696d706c656d656e746174696f6e2e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a090909fd070c4070616c6c65745f626167735f6c697374106c697374244c6973744572726f72000110244475706c6963617465000000284e6f7448656176696572000100304e6f74496e53616d65426167000200304e6f64654e6f74466f756e6400030000010810346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401d505045300000400050801185665633c543e00000508000002d505000908083870616c6c65745f76657374696e672052656c6561736573000108085630000000085631000100000d080c3870616c6c65745f76657374696e671870616c6c6574144572726f72040454000114284e6f7456657374696e6700000484546865206163636f756e7420676976656e206973206e6f742076657374696e672e5441744d617856657374696e675363686564756c65730001082501546865206163636f756e7420616c72656164792068617320604d617856657374696e675363686564756c65736020636f756e74206f66207363686564756c657320616e642074687573510163616e6e6f742061646420616e6f74686572206f6e652e20436f6e7369646572206d657267696e67206578697374696e67207363686564756c657320696e206f7264657220746f2061646420616e6f746865722e24416d6f756e744c6f770002040501416d6f756e74206265696e67207472616e7366657272656420697320746f6f206c6f7720746f2063726561746520612076657374696e67207363686564756c652e605363686564756c65496e6465784f75744f66426f756e6473000304d0416e20696e64657820776173206f7574206f6620626f756e6473206f66207468652076657374696e67207363686564756c65732e54496e76616c69645363686564756c65506172616d730004040d014661696c656420746f206372656174652061206e6577207363686564756c65206265636175736520736f6d6520706172616d657465722077617320696e76616c69642e04744572726f7220666f72207468652076657374696e672070616c6c65742e1108000004080004001508083c70616c6c65745f6d756c7469736967204d756c74697369670c2c426c6f636b4e756d62657201101c42616c616e63650118244163636f756e7449640100001001107768656ef8015854696d65706f696e743c426c6f636b4e756d6265723e00011c6465706f73697418011c42616c616e63650001246465706f7369746f720001244163636f756e744964000124617070726f76616c73510501385665633c4163636f756e7449643e000019080000040ce1050018001d080c3c70616c6c65745f6d756c74697369671870616c6c6574144572726f72040454000138404d696e696d756d5468726573686f6c640000047c5468726573686f6c64206d7573742062652032206f7220677265617465722e3c416c7265616479417070726f766564000104ac43616c6c20697320616c726561647920617070726f7665642062792074686973207369676e61746f72792e444e6f417070726f76616c734e65656465640002049c43616c6c20646f65736e2774206e65656420616e7920286d6f72652920617070726f76616c732e44546f6f4665775369676e61746f72696573000304a854686572652061726520746f6f20666577207369676e61746f7269657320696e20746865206c6973742e48546f6f4d616e795369676e61746f72696573000404ac54686572652061726520746f6f206d616e79207369676e61746f7269657320696e20746865206c6973742e545369676e61746f726965734f75744f664f726465720005040d01546865207369676e61746f7269657320776572652070726f7669646564206f7574206f66206f726465723b20746865792073686f756c64206265206f7264657265642e4c53656e646572496e5369676e61746f726965730006040d015468652073656e6465722077617320636f6e7461696e656420696e20746865206f74686572207369676e61746f726965733b2069742073686f756c646e27742062652e204e6f74466f756e64000704dc4d756c7469736967206f7065726174696f6e206e6f7420666f756e64207768656e20617474656d7074696e6720746f2063616e63656c2e204e6f744f776e65720008042d014f6e6c7920746865206163636f756e742074686174206f726967696e616c6c79206372656174656420746865206d756c74697369672069732061626c6520746f2063616e63656c2069742e2c4e6f54696d65706f696e740009041d014e6f2074696d65706f696e742077617320676976656e2c2079657420746865206d756c7469736967206f7065726174696f6e20697320616c726561647920756e6465727761792e3857726f6e6754696d65706f696e74000a042d014120646966666572656e742074696d65706f696e742077617320676976656e20746f20746865206d756c7469736967206f7065726174696f6e207468617420697320756e6465727761792e4c556e657870656374656454696d65706f696e74000b04f4412074696d65706f696e742077617320676976656e2c20796574206e6f206d756c7469736967206f7065726174696f6e20697320756e6465727761792e3c4d6178576569676874546f6f4c6f77000c04d0546865206d6178696d756d2077656967687420696e666f726d6174696f6e2070726f76696465642077617320746f6f206c6f772e34416c726561647953746f726564000d04a0546865206461746120746f2062652073746f72656420697320616c72656164792073746f7265642e04ad010a090909437573746f6d205b6469737061746368206572726f72735d2868747470733a2f2f646f63732e7375627374726174652e696f2f76332f72756e74696d652f6576656e74732d616e642d6572726f7273290a0909096f6620746869732070616c6c65742e0a0909092108083870616c6c65745f636f756e63696c48436f756e63696c5374616765557064617465042c426c6f636b4e756d626572011000080114737461676525080164436f756e63696c53746167653c426c6f636b4e756d6265723e0001286368616e6765645f617410012c426c6f636b4e756d62657200002508083870616c6c65745f636f756e63696c30436f756e63696c5374616765042c426c6f636b4e756d6265720110010c28416e6e6f756e63696e6704002908018c436f756e63696c5374616765416e6e6f756e63696e673c426c6f636b4e756d6265723e00000020456c656374696f6e04002d080150436f756e63696c5374616765456c656374696f6e0001001049646c65040031080174436f756e63696c537461676549646c653c426c6f636b4e756d6265723e000200002908083870616c6c65745f636f756e63696c58436f756e63696c5374616765416e6e6f756e63696e67042c426c6f636b4e756d62657201100008014063616e646964617465735f636f756e7410010c75333200011c656e64735f617410012c426c6f636b4e756d62657200002d08083870616c6c65745f636f756e63696c50436f756e63696c5374616765456c656374696f6e000004014063616e646964617465735f636f756e7410010c75333200003108083870616c6c65745f636f756e63696c40436f756e63696c537461676549646c65042c426c6f636b4e756d62657201100004011c656e64735f617410012c426c6f636b4e756d6265720000350810346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e6465645665630804540139080453000004003d0801185665633c543e00003908083870616c6c65745f636f756e63696c34436f756e63696c4d656d62657210244163636f756e7449640100204d656d626572496401201c42616c616e636501182c426c6f636b4e756d6265720110001801487374616b696e675f6163636f756e745f69640001244163636f756e7449640001447265776172645f6163636f756e745f69640001244163636f756e7449640001346d656d626572736869705f69642001204d656d62657249640001147374616b6518011c42616c616e63650001486c6173745f7061796d656e745f626c6f636b10012c426c6f636b4e756d626572000134756e706169645f72657761726418011c42616c616e636500003d080000023908004108083870616c6c65745f636f756e63696c2443616e64696461746510244163636f756e74496401001c42616c616e636501181048617368012424566f7465506f7765720118001801487374616b696e675f6163636f756e745f69640001244163636f756e7449640001447265776172645f6163636f756e745f69640001244163636f756e7449640001206379636c655f696420010c7536340001147374616b6518011c42616c616e6365000128766f74655f706f776572180124566f7465506f7765720001246e6f74655f686173685d0201304f7074696f6e3c486173683e00004508083870616c6c65745f636f756e63696c144572726f720404540001603c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729244261644f726967696e000104484f726967696e20697320696e76616c69642e4043616e7443616e6469646174654e6f7700020439015573657220747269656420746f20616e6e6f756e63652063616e646964616379206f757473696465206f66207468652063616e64696461637920616e6e6f756e63656d656e7420706572696f642e4c43616e7452656c656173655374616b654e6f77000304f05573657220747269656420746f2072656c65617365207374616b65206f757473696465206f66207468652072657665616c696e6720706572696f642e5043616e6469646163795374616b65546f6f4c6f77000404b043616e64696461746520686176656e27742070726f76696465642073756666696369656e74207374616b652e4843616e7443616e6469646174655477696365000504f45573657220747269656420746f20616e6e6f756e63652063616e64696461637920747769636520696e207468652073616d6520656c656374696f6e732e40436f6e666c696374696e675374616b650006085d015573657220747269656420746f20616e6e6f756e63652063616e646964616379207769746820616e206163636f756e742074686174206861732074686520636f6e666c696374696e672074797065206f66207374616b653901776974682063616e646964616379207374616b6520616e6420686173206e6f7420656e6f7567682062616c616e636520666f72207374616b696e6720666f7220626f746820707572706f7365732e405374616b655374696c6c4e6565646564000704dc436f756e63696c206d656d62657220616e642063616e646964617465732063616e2774207769746864726177207374616b65207965742e1c4e6f5374616b65000804c45573657220747269656420746f2072656c65617365207374616b65207768656e206e6f207374616b65206578697374732e74496e73756666696369656e7442616c616e6365466f725374616b696e67000904ac496e73756666696369656e742062616c616e636520666f722063616e646964616379207374616b696e672e4c43616e74566f7465466f72596f757273656c66000a048443616e6469646174652063616e277420766f746520666f722068696d73656c662e5c4d656d62657249644e6f744d617463684163636f756e74000b044c496e76616c6964206d656d626572736869702e68496e76616c69644163636f756e74546f5374616b655265757365000c08510154686520636f6d62696e6174696f6e206f66206d656d6265727368697020696420616e64206163636f756e7420696420697320696e76616c696420666f7220756e7374616b696e6720616e206578697374696e674063616e646964616379207374616b652e444e6f7443616e6469646174696e674e6f77000d04d85573657220747269656420746f2077697468647261772063616e646964616379207768656e206e6f742063616e6469646174696e672e6043616e74576974686472617743616e6469646163794e6f77000e04190143616e27742077697468647261772063616e646964616379206f757473696465206f66207468652063616e64696461637920616e6e6f756e63656d656e7420706572696f642e304e6f74436f756e63696c6f72000f0478546865206d656d626572206973206e6f74206120636f756e63696c6f722e88496e73756666696369656e7446756e6473466f7246756e64696e6752657175657374001004f0496e737566666963656e742066756e647320696e20636f756e63696c20666f7220657865637574696e67202746756e64696e67205265717565737427585a65726f42616c616e636546756e64526571756573740011045c46756e642072657175657374206e6f2062616c616e636568526570656174656446756e64526571756573744163636f756e74001204fc5468652073616d65206163636f756e7420697320726563696576696e672066756e64732066726f6d207468652073616d65207265717565737420747769636550456d70747946756e64696e675265717565737473001304ac46756e64696e6720726571756573747320776974686f757420726563696576696e67206163636f756e747370496e73756666696369656e74546f6b656e73466f7246756e64696e67001404f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e670015047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e735443616e646964617465446f65734e6f7445786973740016045843616e646964617465206964206e6f7420666f756e6478496e73756666696369656e7442616c616e6365466f725472616e73666572001704b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e0438436f756e63696c206572726f72734908084470616c6c65745f7265666572656e64756d3c5265666572656e64756d5374616765082c426c6f636b4e756d62657201104c496e7465726d65646961746557696e6e657273014d08010c20496e61637469766500000018566f74696e670400510801885265666572656e64756d5374616765566f74696e673c426c6f636b4e756d6265723e0001002452657665616c696e670400550801e85265666572656e64756d537461676552657665616c696e673c426c6f636b4e756d6265722c20496e7465726d65646961746557696e6e6572733e000200004d0810346672616d655f737570706f72741c73746f72616765407765616b5f626f756e6465645f766563385765616b426f756e6465645665630804540111010453000004000d0101185665633c543e00005108084470616c6c65745f7265666572656e64756d545265666572656e64756d5374616765566f74696e67042c426c6f636b4e756d62657201100010011c7374617274656410012c426c6f636b4e756d62657200015077696e6e696e675f7461726765745f636f756e7410010c75333200014063757272656e745f6379636c655f696420010c75363400011c656e64735f617410012c426c6f636b4e756d62657200005508084470616c6c65745f7265666572656e64756d605265666572656e64756d537461676552657665616c696e67082c426c6f636b4e756d62657201104c496e7465726d65646961746557696e6e657273014d080014011c7374617274656410012c426c6f636b4e756d62657200015077696e6e696e675f7461726765745f636f756e7410010c753332000150696e7465726d6564696174655f77696e6e6572734d08014c496e7465726d65646961746557696e6e65727300014063757272656e745f6379636c655f696420010c75363400011c656e64735f617410012c426c6f636b4e756d62657200005908084470616c6c65745f7265666572656e64756d2043617374566f74650c104861736801242043757272656e63790118204d656d6265724964012000100128636f6d6d69746d656e74240110486173680001206379636c655f696420010c7536340001147374616b6518012043757272656e6379000120766f74655f666f72210101404f7074696f6e3c4d656d62657249643e00005d08084470616c6c65745f7265666572656e64756d144572726f72080454000449000134244261644f726967696e000004444f726967696e20697320696e76616c6964505265666572656e64756d4e6f7452756e6e696e67000104a85265666572656e64756d206973206e6f742072756e6e696e67207768656e20657870656374656420746f5852657665616c696e674e6f74496e50726f6772657373000204b052657665616c696e67207374616765206973206e6f7420696e2070726f6772657373207269676874206e6f775c436f6e666c6963745374616b65734f6e4163636f756e74000304b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e68496e73756666696369656e7442616c616e6365546f5374616b650004049c4163636f756e7420496e73756666696369656e7420467265652042616c616e636520286e6f772944496e73756666696369656e745374616b65000504a8496e73756666696369656e74207374616b652070726f766964656420746f2063617374206120766f746534496e76616c696452657665616c000604190153616c7420616e64207265666572656e64756d206f7074696f6e2070726f766964656420646f6e277420636f72726573706f6e6420746f2074686520636f6d6d69746d656e742c496e76616c6964566f7465000704a4566f746520666f72206e6f74206578697374696e67206f7074696f6e207761732072657665616c65643c566f74654e6f744578697374696e670008049c547279696e6720746f2072657665616c20766f7465207468617420776173206e6f74206361737454416c7265616479566f746564546869734379636c65000904b8547279696e6720746f20766f7465206d756c7469706c652074696d6520696e207468652073616d65206379636c6560556e7374616b696e67566f7465496e53616d654379636c65000a04a0496e76616c69642074696d6520746f2072656c6561736520746865206c6f636b6564207374616b652c53616c74546f6f4c6f6e67000b044053616c7420697320746f6f206c6f6e6748556e7374616b696e67466f7262696464656e000c04f0556e7374616b696e6720686173206265656e20666f7262696464656e20666f7220746865207573657220286174206c6561737420666f72206e6f772904445265666572656e64756d206572726f72736108084470616c6c65745f6d656d62657273686970404d656d626572736869704f626a65637408244163636f756e7449640100104861736801240014012c68616e646c655f6861736824011048617368000130726f6f745f6163636f756e740001244163636f756e744964000148636f6e74726f6c6c65725f6163636f756e740001244163636f756e7449640001207665726966696564880110626f6f6c00011c696e766974657310010c75333200006508084470616c6c65745f6d656d626572736869706c5374616b696e674163636f756e744d656d62657242696e64696e6704204d656d62657249640120000801246d656d6265725f69642001204d656d6265724964000124636f6e6669726d6564880110626f6f6c00006908084470616c6c65745f6d656d62657273686970144572726f720404540001547c4e6f74456e6f75676842616c616e6365546f4275794d656d62657273686970000004944e6f7420656e6f7567682062616c616e636520746f20627579206d656d626572736869702e64436f6e74726f6c6c65724163636f756e74526571756972656400010470436f6e74726f6c6c6572206163636f756e742072657175697265642e4c526f6f744163636f756e74526571756972656400020458526f6f74206163636f756e742072657175697265642e38556e7369676e65644f726967696e00030440556e7369676e6564206f726967696e2e544d656d62657250726f66696c654e6f74466f756e64000404b44d656d6265722070726f66696c65206e6f7420666f756e642028696e76616c6964206d656d626572206964292e5c48616e646c65416c7265616479526567697374657265640005046848616e646c6520616c726561647920726567697374657265642e9848616e646c654d757374426550726f7669646564447572696e67526567697374726174696f6e000604b048616e646c65206d7573742062652070726f766964656420647572696e6720726567697374726174696f6e2e4c526566657272657249734e6f744d656d626572000704d043616e6e6f742066696e642061206d656d6265727368697020666f7220612070726f76696465642072656665727265722069642e8443616e6e6f745472616e73666572496e7669746573466f724e6f744d656d6265720008049853686f756c642062652061206d656d62657220746f207265636569766520696e76697465732e404e6f74456e6f756768496e7669746573000904ac4e6f7420656e6f75676820696e766974657320746f20706572666f726d20616e206f7065726174696f6e2e60576f726b696e6747726f75704c65616465724e6f74536574000a04ac4d656d6265727368697020776f726b696e672067726f7570206c6561646572206973206e6f74207365742e845374616b696e674163636f756e744973416c726561647952656769737465726564000b04b85374616b696e67206163636f756e74206973207265676973746572656420666f7220736f6d65206d656d6265722e645374616b696e674163636f756e74446f65736e744578697374000c04b45374616b696e67206163636f756e7420666f72206d656d6265727368697020646f65736e27742065786973742e785374616b696e674163636f756e74416c7265616479436f6e6669726d6564000d04ac5374616b696e67206163636f756e742068617320616c7265616479206265656e20636f6e6669726d65642eb0576f726b696e6747726f757042756467657449734e6f7453756666696369656e74466f72496e766974696e67000e08490143616e6e6f7420696e766974652061206d656d6265722e20576f726b696e672067726f75702062616c616e6365206973206e6f742073756666696369656e7420746f20736574207468652064656661756c742062616c616e63652e3c436f6e666c696374696e674c6f636b000f04410143616e6e6f7420696e766974652061206d656d6265722e2054686520636f6e74726f6c6c6572206163636f756e742068617320616e206578697374696e6720636f6e666c696374696e67206c6f636b2e8c43616e6e6f74457863656564526566657272616c43757450657263656e744c696d6974001004010143616e6e6f7420736574206120726566657272616c206375742070657263656e742076616c75652e20546865206c696d6974207761732065786365656465642e5c436f6e666c6963745374616b65734f6e4163636f756e74001104b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b6500120490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e504769664c6f636b45786365656473437265646974001304ac4c6f636b656420616d6f756e742069732067726561746572207468616e2063726564697420616d6f756e7464496e73756666696369656e7442616c616e6365546f47696674001404c047696674657220646f65736e277420686176652073756666696369656e742062616c616e636520746f20637265646974048c4d656d62657273686970206d6f64756c6520707265646566696e6564206572726f72736d08083070616c6c65745f666f72756d2043617465676f72790c2843617465676f7279496401201048617368012444537469636b696564546872656164496473017108002001287469746c655f68617368240110486173680001406465736372697074696f6e5f68617368240110486173680001206172636869766564880110626f6f6c0001606e756d5f6469726563745f73756263617465676f7269657310010c7533320001486e756d5f6469726563745f7468726561647310010c7533320001546e756d5f6469726563745f6d6f64657261746f727310010c753332000148706172656e745f63617465676f72795f6964210101484f7074696f6e3c43617465676f727949643e000144737469636b795f7468726561645f69647371080144537469636b6965645468726561644964730000710810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e00007508083070616c6c65745f666f72756d185468726561640c2c466f72756d55736572496401202843617465676f72794964012048526570617961626c65426c6f6174426f6e6401c5010010012c63617465676f72795f696420012843617465676f72794964000124617574686f725f696420012c466f72756d55736572496400013c636c65616e75705f7061795f6f6666c5010148526570617961626c65426c6f6174426f6e640001606e756d6265725f6f665f6564697461626c655f706f7374732001344e756d6265724f66506f73747300007908083070616c6c65745f666f72756d10506f7374142c466f72756d55736572496401202054687265616449640120104861736801242c426c6f636b4e756d626572011048526570617961626c65426c6f6174426f6e6401c501001401247468726561645f69642001205468726561644964000124746578745f6861736824011048617368000124617574686f725f696420012c466f72756d55736572496400013c636c65616e75705f7061795f6f6666c5010148526570617961626c65426c6f6174426f6e6400012c6c6173745f65646974656410012c426c6f636b4e756d62657200007d08083070616c6c65745f666f72756d144572726f7204045400016c3c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729484f726967696e4e6f74466f72756d4c656164000104b44f726967696e20646f65736e277420636f72726573706f6e6420746f20616e79206c656164206163636f756e7468466f72756d5573657249644e6f744d617463684163636f756e7400020490466f72756d2075736572206964206e6f74206d6174636820697473206163636f756e742e684d6f64657261746f7249644e6f744d617463684163636f756e740003048c4d6f64657261746f72206964206e6f74206d6174636820697473206163636f756e742e7c4163636f756e74446f65734e6f744d61746368546872656164417574686f7200040498546872656164206e6f7420617574686f7265642062792074686520676976656e20757365722e48546872656164446f65734e6f7445786973740005045454687265616420646f6573206e6f742065786973747c4d6f64657261746f724d6f6465726174654f726967696e43617465676f7279000604d04d6f64657261746f722063616e2774206d6f6465726174652063617465676f727920636f6e7461696e696e67207468726561642e904d6f64657261746f724d6f64657261746544657374696e6174696f6e43617465676f7279000704b84d6f64657261746f722063616e2774206d6f6465726174652064657374696e6174696f6e2063617465676f72792e445468726561644d6f7665496e76616c6964000804984f726967696e206973207468652073616d65206173207468652064657374696e6174696f6e2e545468726561644e6f744265696e675570646174656400090464546872656164206e6f74206265696e6720757064617465642e90496e73756666696369656e7442616c616e6365466f725468726561644372656174696f6e000a048c4e6f7420656e6f7567682062616c616e636520746f20637265617465207468726561649843616e6e6f7444656c657465546872656164576974684f75747374616e64696e67506f737473000b04c441207468726561642077697468206f75747374616e64696e6720706f7374732063616e6e6f742062652072656d6f76656440506f7374446f65734e6f744578697374000c0450506f737420646f6573206e6f742065786973742e744163636f756e74446f65734e6f744d61746368506f7374417574686f72000d048c4163636f756e7420646f6573206e6f74206d6174636820706f737420617574686f722e68496e73756666696369656e7442616c616e6365466f72506f7374000e04684e6f7420656e6f7567682062616c616e636520746f20706f73745c43617465676f72794e6f744265696e6755706461746564000f046c43617465676f7279206e6f74206265696e6720757064617465642e64416e636573746f7243617465676f7279496d6d757461626c65001004d4416e636573746f722063617465676f727920696d6d757461626c652c20692e652e2064656c65746564206f72206172636869766564744d617856616c696443617465676f727944657074684578636565646564001104984d6178696d756d2076616c69642063617465676f72792064657074682065786365656465642e5043617465676f7279446f65734e6f7445786973740012046043617465676f727920646f6573206e6f742065786973742e7443617465676f72794d6f64657261746f72446f65734e6f744578697374001304c850726f7669646564206d6f64657261746f72206973206e6f7420676976656e2063617465676f7279206d6f64657261746f725c43617465676f72794e6f74456d707479546872656164730014049443617465676f7279207374696c6c20636f6e7461696e7320736f6d6520746872656164732e6843617465676f72794e6f74456d70747943617465676f72696573001504ac43617465676f7279207374696c6c20636f6e7461696e7320736f6d652073756263617465676f726965732e6c4d6f64657261746f7243616e7444656c65746543617465676f7279001604884e6f207065726d697373696f6e7320746f2064656c6574652063617465676f72792e6c4d6f64657261746f7243616e7455706461746543617465676f7279001704884e6f207065726d697373696f6e7320746f207570646174652063617465676f72792e304d617053697a654c696d6974001804904d6178696d756d2073697a65206f662073746f72616765206d617020657863656564656484506174684c656e67746853686f756c644265477265617465725468616e5a65726f001904b443617465676f72792070617468206c656e2073686f756c642062652067726561746572207468616e207a65726f884d61784e756d6265724f66537469636b696564546872656164734578636565646564001a04e04d6178696d756d206e756d626572206f6620737469636b6965642074687265616473207065722063617465676f7279206578636565646564045c466f72756d20707265646566696e6564206572726f72738108084c70616c6c65745f636f6e737469747574696f6e40436f6e737469747574696f6e496e666f041048617368012400040124746578745f686173682401104861736800008508083470616c6c65745f626f756e747930426f756e74795265636f7264101c42616c616e636501182c426c6f636b4e756d6265720110204d656d626572496401205c436c6f736564436f6e747261637457686974656c6973740189080014013c6372656174696f6e5f706172616d738d08012501426f756e7479506172616d65746572733c42616c616e63652c20426c6f636b4e756d6265722c204d656d62657249642c20436c6f736564436f6e747261637457686974656c6973743e000134746f74616c5f66756e64696e6718011c42616c616e63650001246d696c6573746f6e6595080170426f756e74794d696c6573746f6e653c426c6f636b4e756d6265723e00015c6163746976655f776f726b5f656e7472795f636f756e7410010c7533320001606861735f756e706169645f6f7261636c655f726577617264880110626f6f6c0000890810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e00008d08083470616c6c65745f626f756e747940426f756e7479506172616d6574657273101c42616c616e636501182c426c6f636b4e756d6265720110204d656d626572496401205c436c6f736564436f6e747261637457686974656c697374018908001c01186f7261636c655d010154426f756e74794163746f723c4d656d62657249643e000134636f6e74726163745f74797065910801b84173737572616e6365436f6e7472616374547970653c436c6f736564436f6e747261637457686974656c6973743e00011c63726561746f725d010154426f756e74794163746f723c4d656d62657249643e00011863686572727918011c42616c616e63650001346f7261636c655f72657761726418011c42616c616e6365000134656e7472616e745f7374616b6518011c42616c616e636500013066756e64696e675f747970656501018446756e64696e67547970653c426c6f636b4e756d6265722c2042616c616e63653e00009108083470616c6c65745f626f756e7479544173737572616e6365436f6e747261637454797065045c436c6f736564436f6e747261637457686974656c6973740189080108104f70656e00000018436c6f73656404008908015c436c6f736564436f6e747261637457686974656c697374000100009508083470616c6c65745f626f756e74793c426f756e74794d696c6573746f6e65042c426c6f636b4e756d626572011001141c43726561746564080128637265617465645f617410012c426c6f636b4e756d6265720001446861735f636f6e747269627574696f6e73880110626f6f6c0000005c426f756e74794d617846756e64696e675265616368656400010034576f726b5375626d6974746564000200285465726d696e61746564000300444a7564676d656e745375626d69747465640401447375636365737366756c5f626f756e7479880110626f6f6c00040000990800000408205d01009d08083470616c6c65745f626f756e747930436f6e747269627574696f6e0404540000080118616d6f756e7418013042616c616e63654f663c543e00017866756e6465725f73746174655f626c6f61745f626f6e645f616d6f756e7418013042616c616e63654f663c543e0000a108083470616c6c65745f626f756e74792c456e7472795265636f72640c244163636f756e7449640100204d656d626572496401202c426c6f636b4e756d6265720110001001246d656d6265725f69642001204d656d62657249640001487374616b696e675f6163636f756e745f69640001244163636f756e7449640001307375626d69747465645f617410012c426c6f636b4e756d626572000138776f726b5f7375626d6974746564880110626f6f6c0000a508083470616c6c65745f626f756e7479144572726f7204045400018c3c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729b04d696e46756e64696e67416d6f756e7443616e6e6f744265477265617465725468616e4d6178416d6f756e74000104d44d696e2066756e64696e6720616d6f756e742063616e6e6f742062652067726561746572207468616e206d617820616d6f756e742e44426f756e7479446f65736e74457869737400020450426f756e747920646f65736e742065786973742e605377697463684f7261636c654f726967696e4973526f6f7400030489014f726967696e20697320726f6f742c20736f20737769746368696e67206f7261636c65206973206e6f7420616c6c6f77656420696e20746869732065787472696e7369632e202863616c6c207377697463685f6f7261636c655f61735f726f6f742974496e76616c69645374616765556e657870656374656446756e64696e67000404c8556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a2046756e64696e672ea8496e76616c69645374616765556e65787065637465644e6f46756e64696e67436f6e7472696275746564000504fc556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a204e6f46756e64696e67436f6e74726962757465642e7c496e76616c69645374616765556e657870656374656443616e63656c6c6564000604d0556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a2043616e63656c6c65642e90496e76616c69645374616765556e6578706563746564576f726b5375626d697373696f6e000704e4556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a20576f726b5375626d697373696f6e2e78496e76616c69645374616765556e65787065637465644a7564676d656e74000804cc556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a204a7564676d656e742ec0496e76616c69645374616765556e65787065637465645375636365737366756c426f756e74795769746864726177616c0009041501556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a205375636365737366756c426f756e74795769746864726177616c2eb0496e76616c69645374616765556e65787065637465644661696c6564426f756e74795769746864726177616c000a040501556e657870656374656420626f756e747920737461676520666f7220616e206f7065726174696f6e3a204661696c6564426f756e74795769746864726177616c2e70496e73756666696369656e7442616c616e6365466f72426f756e7479000b04a4496e73756666696369656e742062616c616e636520666f72206120626f756e7479206368657272792e644e6f426f756e7479436f6e747269627574696f6e466f756e64000c048443616e6e6f7420666f756e6420626f756e747920636f6e747269627574696f6e2e6c496e73756666696369656e7442616c616e6365466f725374616b65000d04a05468657265206973206e6f7420656e6f7567682062616c616e636520666f722061207374616b652e44436f6e666c696374696e675374616b6573000e04bc54686520636f6e666c696374696e67207374616b6520646973636f76657265642e2043616e6e6f74207374616b652e50576f726b456e747279446f65736e744578697374000f0460576f726b20656e74727920646f65736e742065786973742e704368657272794c6573735468656e4d696e696d756d416c6c6f77656400100484436865727279206c657373207468616e206d696e696d756d20616c6c6f7765642e9843616e6e6f745375626d6974576f726b546f436c6f736564436f6e7472616374426f756e74790011085101496e636f6d70617469626c65206173737572616e636520636f6e7472616374207479706520666f722061206d656d6265723a2063616e6e6f74207375626d697420776f726b20746f207468652027636c6f7365646c6173737572616e63652720626f756e747920636f6e74726163742e7c436c6f736564436f6e74726163744d656d6265724c6973744973456d707479001204290143616e6e6f742063726561746520612027636c6f736564206173737572616e636520636f6e74726163742720626f756e7479207769746820656d707479206d656d626572206c6973742e88436c6f736564436f6e74726163744d656d6265724c6973744973546f6f4c61726765001308290143616e6e6f742063726561746520612027636c6f736564206173737572616e636520636f6e74726163742720626f756e74792077697468206d656d626572206c697374206c6172676572887468616e20616c6c6f776564206d617820776f726b20656e747279206c696d69742e70436c6f736564436f6e74726163744d656d6265724e6f74466f756e64001404410127636c6f736564206173737572616e636520636f6e74726163742720626f756e7479206d656d626572206c6973742063616e206f6e6c7920696e636c756465206578697374696e67206d656d6265727354496e76616c69644f7261636c654d656d6265724964001504fc50726f7669646564206f7261636c65206d656d62657220696420646f6573206e6f742062656c6f6e6720746f20616e206578697374696e67206d656d62657278496e76616c69645374616b696e674163636f756e74466f724d656d626572001604ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e405a65726f57696e6e65725265776172640017048c43616e6e6f7420736574207a65726f2072657761726420666f722077696e6e6572732e98546f74616c52657761726453686f756c644265457175616c546f546f74616c46756e64696e67001804150154686520746f74616c2072657761726420666f722077696e6e6572732073686f756c6420626520657175616c20746f20746f74616c20626f756e74792066756e64696e672e74456e7472616e745374616b6549734c6573735468616e4d696e696e756d0019042d0143616e6e6f7420637265617465206120626f756e7479207769746820616e20656e7472616e74207374616b65206973206c657373207468616e207265717569726564206d696e696d756d2e6446756e64696e67416d6f756e7443616e6e6f7442655a65726f001a04e843616e6e6f7420637265617465206120626f756e74792077697468207a65726f2066756e64696e6720616d6f756e7420706172616d657465722e6446756e64696e67506572696f6443616e6e6f7442655a65726f001b04e843616e6e6f7420637265617465206120626f756e74792077697468207a65726f2066756e64696e6720706572696f6420706172616d657465722e7457696e6e657253686f756c64486173576f726b5375626d697373696f6e001c04f0496e76616c6964206a7564676d656e74202d20616c6c2077696e6e6572732073686f756c64206861766520776f726b207375626d697373696f6e732e80496e76616c6964436f6e7472696275746f724163746f72537065636966696564001d0470426f756e747920636f6e7472696275746f72206e6f7420666f756e646c496e76616c69644f7261636c654163746f72537065636966696564001e045c426f756e7479206f7261636c65206e6f7420666f756e6474496e76616c6964456e7472616e74576f726b6572537065636966696564001f04a44d656d62657220737065636966696564206973206e6f7420616e20656e7472616e7420776f726b657270496e76616c696443726561746f724163746f72537065636966696564002004a8496e76616c69642043726561746f72204163746f7220666f7220426f756e74792073706563696669656474576f726b456e747279446f65736e7442656c6f6e67546f576f726b6572002104f8576f726b657220747269656420746f20616363657373206120776f726b20656e747279207468617420646f65736e27742062656c6f6e6720746f2068696d704f7261636c65526577617264416c726561647957697468647261776e002204884f7261636c65206861766520616c7265616479206265656e2077697468647261776e047c426f756e74792070616c6c657420707265646566696e6564206572726f7273a908083870616c6c65745f7574696c697479144572726f7204045400010c80496e73756666696369656e7446756e6473466f724275646765745570646174650000041d01496e73756666696369656e742066756e647320666f72202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20657865637574696f6e385a65726f546f6b656e734275726e00010468547279696e6720746f206275726e207a65726f20746f6b656e7360496e73756666696369656e7446756e6473466f724275726e00020478496e73756666696369656e742066756e647320666f72206275726e696e670478436f646578206d6f64756c6520707265646566696e6564206572726f7273ad080c3870616c6c65745f636f6e74656e741474797065732c566964656f5265636f726410244368616e6e656c49640120204f776e65644e667401b10838566964656f41737365747353657401d10848526570617961626c65426c6f6174426f6e6401c50100100128696e5f6368616e6e656c2001244368616e6e656c49640001286e66745f737461747573d50801404f7074696f6e3c4f776e65644e66743e000130646174615f6f626a65637473d1080138566964656f417373657473536574000158766964656f5f73746174655f626c6f61745f626f6e64c5010148526570617961626c65426c6f6174426f6e640000b108103870616c6c65745f636f6e74656e740c6e6674147479706573204f776e65644e66740c4c5472616e73616374696f6e616c53746174757301b508204d656d626572496401202441756374696f6e49640120001001146f776e6572cd0801484e66744f776e65723c4d656d62657249643e0001507472616e73616374696f6e616c5f737461747573b508014c5472616e73616374696f6e616c53746174757300013c63726561746f725f726f79616c7479f501013c4f7074696f6e3c526f79616c74793e00014c6f70656e5f61756374696f6e735f6e6f6e636520012441756374696f6e49640000b508103870616c6c65745f636f6e74656e740c6e6674147479706573645472616e73616374696f6e616c5374617475735265636f726410204d656d626572496401201c42616c616e6365011848456e676c69736841756374696f6e5479706501b9083c4f70656e41756374696f6e5479706501c90801141049646c6500000058496e697469617465644f66666572546f4d656d62657208002001204d656d626572496400003101013c4f7074696f6e3c42616c616e63653e00010038456e676c69736841756374696f6e0400b9080148456e676c69736841756374696f6e547970650002002c4f70656e41756374696f6e0400c908013c4f70656e41756374696f6e54797065000300184275794e6f77040018011c42616c616e636500040000b908103870616c6c65745f636f6e74656e740c6e667414747970657350456e676c69736841756374696f6e5265636f7264102c426c6f636b4e756d62657201101c42616c616e63650118204d656d626572496401204c4e667441756374696f6e57686974656c69737401bd08002001387374617274696e675f707269636518011c42616c616e63650001346275795f6e6f775f70726963653101013c4f7074696f6e3c42616c616e63653e00012477686974656c697374bd08014c4e667441756374696f6e57686974656c69737400010c656e6410012c426c6f636b4e756d626572000114737461727410012c426c6f636b4e756d626572000140657874656e73696f6e5f706572696f6410012c426c6f636b4e756d6265720001306d696e5f6269645f7374657018011c42616c616e636500011c746f705f626964c10801b04f7074696f6e3c456e676c69736841756374696f6e4269643c42616c616e63652c204d656d62657249643e3e0000bd0810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000c10804184f7074696f6e04045401c5080108104e6f6e6500000010536f6d650400c5080000010000c508103870616c6c65745f636f6e74656e740c6e667414747970657344456e676c69736841756374696f6e426964081c42616c616e63650118204d656d6265724964012000080118616d6f756e7418011c42616c616e63650001246269646465725f69642001204d656d62657249640000c908103870616c6c65745f636f6e74656e740c6e6674147479706573444f70656e41756374696f6e5265636f7264102c426c6f636b4e756d62657201102441756374696f6e496401201c42616c616e636501184c4e667441756374696f6e57686974656c69737401bd08001801387374617274696e675f707269636518011c42616c616e63650001346275795f6e6f775f70726963653101013c4f7074696f6e3c42616c616e63653e00012477686974656c697374bd08014c4e667441756374696f6e57686974656c6973740001446269645f6c6f636b5f6475726174696f6e10012c426c6f636b4e756d62657200012861756374696f6e5f696420012441756374696f6e4964000114737461727410012c426c6f636b4e756d6265720000cd08103870616c6c65745f636f6e74656e740c6e6674147479706573204e66744f776e657204204d656d626572496401200108304368616e6e656c4f776e6572000000184d656d62657204002001204d656d626572496400010000d10810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000d50804184f7074696f6e04045401b1080108104e6f6e6500000010536f6d650400b1080000010000d908103870616c6c65745f636f6e74656e742c7065726d697373696f6e733463757261746f725f67726f75704843757261746f7247726f75705265636f7264085c43757261746f7247726f757043757261746f72734d617001dd08704d6f6465726174696f6e5065726d697373696f6e7342794c6576656c01e108000c012063757261746f7273dd08015c43757261746f7247726f757043757261746f72734d6170000118616374697665880110626f6f6c0001507065726d697373696f6e735f62795f6c6576656ce10801704d6f6465726174696f6e5065726d697373696f6e7342794c6576656c0000dd0810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b01200456019901045300000400a901013842547265654d61703c4b2c20563e0000e10810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b0108045601e508045300000400e908013842547265654d61703c4b2c20563e0000e50810346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540141020453000004003d02012c42547265655365743c543e0000e908042042547265654d617008044b0108045601e508000400ed08000000ed08000002f10800f1080000040808e50800f508103870616c6c65745f636f6e74656e740c6e6674147479706573504f70656e41756374696f6e4269645265636f72640c1c42616c616e636501182c426c6f636b4e756d62657201102441756374696f6e49640120000c0118616d6f756e7418011c42616c616e63650001346d6164655f61745f626c6f636b10012c426c6f636b4e756d62657200012861756374696f6e5f696420012441756374696f6e49640000f9080c3870616c6c65745f636f6e74656e74186572726f7273144572726f7204045400010102704368616e6e656c5374617465426c6f6174426f6e644368616e676564000004e4496e76616c69642065787472696e7369632063616c6c3a204368616e6e656c20737461746520626c6f617420626f6e64206368616e6765642e68566964656f5374617465426c6f6174426f6e644368616e676564000104dc496e76616c69642065787472696e7369632063616c6c3a20766964656f20737461746520626c6f617420626f6e64206368616e6765642e544d696e436173686f757456616c7565546f6f4c6f77000204d8417474656d707420746f20736574206d696e696d756d20636173686f757420616c6c6f7765642062656c6f7720746865206c696d6974584d6178436173686f757456616c7565546f6f48696768000304d8417474656d707420746f20736574206d696e696d756d20636173686f757420616c6c6f7765642061626f766520746865206c696d69749c4d61784e756d6265724f664368616e6e656c436f6c6c61626f7261746f7273457863656564656400040429014e756d626572206f66206368616e6e656c20636f6c6c61626f7261746f72732065786365656473204d61784e756d6265724f66436f6c6c61626f7261746f72735065724368616e6e656c804d61784e756d6265724f664368616e6e656c4173736574734578636565646564000504f04e756d626572206f66206368616e6e656c206173736574732065786365656473204d61784e756d6265724f664173736574735065724368616e6e656c784d61784e756d6265724f66566964656f4173736574734578636565646564000604ec4e756d626572206f6620766964656f206173736574732065786365656473204d61784d61784e756d6265724f66417373657473506572566964656fa84d61784e756d6265724f664368616e6e656c4167656e745065726d697373696f6e73457863656564656400070419014d6178696d756d206e756d626572206f66206368616e6e656c206167656e74207065726d697373696f6e7320666f72206368616e6e656c206167656e74206578636565646564ac4d61784e756d6265724f6650617573656446656174757265735065724368616e6e656c4578636565646564000804d84d6178696d756d206e756d626572206f662070617573656420666561747572657320706572206368616e6e656c20657863656564656480496e76616c69644368616e6e656c4261675769746e65737350726f766964656400090411014368616e6e656c20626167207769746e65737320706172616d657465727320646f6e2774206d61746368207468652063757272656e742072756e74696d652073746174659c496e76616c696453746f726167654275636b6574734e756d5769746e65737350726f7669646564000a04450153746f72616765206275636b657473206e756d626572207769746e65737320706172616d6574657220646f6573206e6f74206d61746368207468652063757272656e742072756e74696d652073746174657c4d697373696e6753746f726167654275636b6574734e756d5769746e657373000b084d0153746f72616765206275636b657473206e756d626572207769746e65737320706172616d65746572206d7573742062652070726f7669646564207768656e206368616e6e656c2f766964656f2061737365747348617265206265696e6720757064617465642e784368616e6e656c4f776e65724d656d626572446f65734e6f744578697374000c04b850726f7669646564206368616e6e656c206f776e657220286d656d6265722920646f6573206e6f74206578697374904368616e6e656c4f776e657243757261746f7247726f7570446f65734e6f744578697374000d04d450726f7669646564206368616e6e656c206f776e6572202863757261746f722067726f75702920646f6573206e6f74206578697374b04368616e6e656c5374617465426c6f6174426f6e6442656c6f774578697374656e7469616c4465706f736974000e0809014368616e6e656c20737461746520626c6f617420626f6e642063616e6e6f74206265206c6f776572207468616e206578697374656e7469616c206465706f7369742c050162656361757365206974206d7573742073656375726520746865206368616e6e656c206d6f64756c65206163636f756e7420616761696e73742064757374696e67704e756d6265724f66417373657473546f52656d6f766549735a65726f000f04a90144656c657465206368616e6e656c20616e642061737365747320616e642064656c65746520766964656f20617373657473206d75737420686176652061206e756d626572206f662061737365747320746f2072656d6f76652067726561746572207468616e207a65726f9843757261746f7249734e6f74414d656d6265724f66476976656e43757261746f7247726f7570001004450143757261746f7220756e6465722070726f76696465642063757261746f72206964206973206e6f742061206d656d626572206f662063757261726f722067726f757020756e64657220676976656e206964a843757261746f724973416c7265616479414d656d6265724f66476976656e43757261746f7247726f7570001104550143757261746f7220756e6465722070726f76696465642063757261746f7220696420697320616c72656164792061206d656d626572206f662063757261726f722067726f757020756e64657220676976656e2069646043757261746f7247726f7570446f65734e6f74457869737400120488476976656e2063757261746f722067726f757020646f6573206e6f742065786973747043757261746f727350657247726f75704c696d697452656163686564001304b84d6178206e756d626572206f662063757261746f7273207065722067726f7570206c696d697420726561636865645c43757261746f7247726f757049734e6f744163746976650014046c43757261746f722067726f7570206973206e6f74206163746976654043757261746f724964496e76616c6964001504d843757261746f72206964206973206e6f74206120776f726b657220696420696e20636f6e74656e7420776f726b696e672067726f7570384c656164417574684661696c6564001604684c6561642061757468656e7469636174696f6e206661696c6564404d656d626572417574684661696c6564001704704d656d6265722061757468656e7469636174696f6e206661696c65644443757261746f72417574684661696c65640018047443757261746f722061757468656e7469636174696f6e206661696c6564244261644f726967696e00190478457870656374656420726f6f74206f72207369676e6564206f726967696e484163746f724e6f74417574686f72697a6564001a04b04f7065726174696f6e2063616e6e6f7420626520706572666f6d656420776974682074686973204163746f725043617465676f7279446f65734e6f744578697374001b04ac41204368616e6e656c206f7220566964656f2043617465676f727920646f6573206e6f742065786973742e4c4368616e6e656c446f65734e6f744578697374001c04584368616e6e656c20646f6573206e6f7420657869737444566964656f446f65734e6f744578697374001d0450566964656f20646f6573206e6f7420657869737434566964656f496e536561736f6e001e04f4566664656f20696e20736561736f6e2063616e60742062652072656d6f766564202862656361757365206f7264657220697320696d706f7274616e7429444163746f7243616e6e6f7442654c656164001f04c84163746f722063616e6e6f7420617574686f72697a65206173206c65616420666f7220676976656e2065787472696e736963544163746f7243616e6e6f744f776e4368616e6e656c002004604163746f722063616e6e6f74204f776e206368616e6e656c604e6674416c72656164794f776e656442794368616e6e656c002104a4417474656d707420746f20736c696e67206261636b2061206368616e6e656c206f776e6564206e6674404e6674416c7265616479457869737473002204944e667420666f7220676976656e20766964656f20696420616c7265616479206578697374733c4e6674446f65734e6f744578697374002304944e667420666f7220676976656e20766964656f20696420646f6573206e6f742065786973746c4f766572666c6f774f72556e646572666c6f7748617070656e6564002404904f766572666c6f77206f7220756e646572666c6f77206572726f722068617070656e656434446f65734e6f744f776e4e667400250474476976656e206f726967696e20646f6573206e6f74206f776e206e667464526f79616c74795570706572426f756e64457863656564656400260470526f79616c747920557070657220426f756e6420457863656564656464526f79616c74794c6f776572426f756e64457863656564656400270470526f79616c7479204c6f77657220426f756e642045786365656465648441756374696f6e4475726174696f6e5570706572426f756e6445786365656465640028049441756374696f6e206475726174696f6e20757070657220626f756e642065786365656465648441756374696f6e4475726174696f6e4c6f776572426f756e6445786365656465640029049441756374696f6e206475726174696f6e206c6f77657220626f756e6420657863656564656484457874656e73696f6e506572696f645570706572426f756e644578636565646564002a04b441756374696f6e20657874656e73696f6e20706572696f6420757070657220626f756e6420657863656564656484457874656e73696f6e506572696f644c6f776572426f756e644578636565646564002b04b441756374696f6e20657874656e73696f6e20706572696f64206c6f77657220626f756e64206578636565646564844269644c6f636b4475726174696f6e5570706572426f756e644578636565646564002c0498426964206c6f636b206475726174696f6e20757070657220626f756e64206578636565646564844269644c6f636b4475726174696f6e4c6f776572426f756e644578636565646564002d0498426964206c6f636b206475726174696f6e206c6f77657220626f756e642065786365656465647c5374617274696e6750726963655570706572426f756e644578636565646564002e048c5374617274696e6720707269636520757070657220626f756e642065786365656465647c5374617274696e6750726963654c6f776572426f756e644578636565646564002f048c5374617274696e67207072696365206c6f77657220626f756e642065786365656465648041756374696f6e426964537465705570706572426f756e6445786365656465640030049441756374696f6e20626964207374657020757070657220626f756e642065786365656465648041756374696f6e426964537465704c6f776572426f756e6445786365656465640031049441756374696f6e206269642073746570206c6f77657220626f756e642065786365656465644c496e73756666696369656e7442616c616e636500320450496e73756666696369656e742062616c616e63656442696453746570436f6e73747261696e7456696f6c61746564003304b44d696e696d616c2061756374696f6e20626964207374657020636f6e73747261696e742076696f6c617465642e64496e76616c6964426964416d6f756e7453706563696669656400340488436f6d6d697420766572696669636174696f6e20666f722062696420616d6f756e747c5374617274696e675072696365436f6e73747261696e7456696f6c61746564003504ac41756374696f6e207374617274696e6720707269636520636f6e73747261696e742076696f6c617465642e50416374696f6e48617342696473416c7265616479003604a8416c7265616479206163746976652061756374696f6e2063616e6e6f742062652063616e63656c6c6564304e667449734e6f7449646c65003704990143616e206e6f74206372656174652061756374696f6e20666f72204e66742c2069662061756374696f6e2068617665206265656e20616c72656164792073746172746564206f72206e6674206973206c6f636b656420666f7220746865207472616e736665726050656e64696e674f66666572446f65734e6f7445786973740038047c4e6f2070656e64696e67206f666665727320666f7220676976656e204e6674545265776172644163636f756e7449734e6f74536574003904c843726561746f7220726f79616c747920726571756972657320726577617264206163636f756e7420746f206265207365742e404163746f7249734e6f74426964646572003a04684163746f72206973206e6f742061206c617374206269646465726041756374696f6e43616e6e6f744265436f6d706c65746564003b046c41756374696f6e2063616e6e6f7420626520636f6d706c657465643c426964446f65734e6f744578697374003c046841756374696f6e20646f6573206e6f74206861766520626964734c4269644973466f725061737441756374696f6e003d049453656c65637465642042696420697320666f722070617374206f70656e2061756374696f6e6853746172747341744c6f776572426f756e644578636565646564003e049841756374696f6e20737461727473206174206c6f77657220626f756e642065786365656465646853746172747341745570706572426f756e644578636565646564003f049841756374696f6e2073746172747320617420757070657220626f756e642065786365656465644841756374696f6e4469644e6f7453746172740040045c41756374696f6e20646964206e6f742073746172746564444e6f74496e41756374696f6e53746174650041046c4e6674206973206e6f7420696e2061756374696f6e2073746174657c4d656d62657249734e6f74416c6c6f776564546f5061727469636970617465004204bc4d656d626572206973206e6f7420616c6c6f77656420746f20706172746963697061746520696e2061756374696f6e544d656d62657250726f66696c654e6f74466f756e64004304604d656d6265722070726f66696c65206e6f7420666f756e644c4e66744e6f74496e4275794e6f7753746174650044049c476976656e20766964656f206e6674206973206e6f7420696e20627579206e6f7720737461746584496e76616c69644275794e6f775769746e657373507269636550726f76696465640045045501607769746e6573735f7072696365602070726f766964656420746f20606275795f6e6f77602065787472696e73696320646f6573206e6f74206d61746368207468652063757272656e742073656c6c2070726963655049734e6f744f70656e41756374696f6e547970650046046841756374696f6e2074797065206973206e6f7420604f70656e605c49734e6f74456e676c69736841756374696f6e547970650047047441756374696f6e2074797065206973206e6f742060456e676c697368606c4269644c6f636b4475726174696f6e49734e6f744578706972656400480480426964206c6f636b206475726174696f6e206973206e6f742065787069726564684e667441756374696f6e4973416c726561647945787069726564004904784e66742061756374696f6e20697320616c72656164792065787069726564904275794e6f774d7573744265477265617465725468616e5374617274696e675072696365004a04ac41756374696f6e20627579206e6f77206973206c657373207468656e207374617274696e67207072696365605461726765744d656d626572446f65734e6f744578697374004b04984e6674206f6666657220746172676574206d656d62657220646f6573206e6f742065786973748c496e76616c69644e66744f666665725769746e657373507269636550726f7669646564004c040d0143757272656e74206e6674206f6666657220707269636520646f6573206e6f74206d61746368207468652070726f766964656420607769746e6573735f707269636560ac4d617841756374696f6e57686974654c6973744c656e6774685570706572426f756e644578636565646564004d04c44d61782061756374696f6e2077686974656c697374206c656e67746820757070657220626f756e642065786365656465646457686974656c6973744861734f6e6c794f6e654d656d626572004e049441756374696f6e2077686974656c69737420686173206f6e6c79206f6e65206d656d6265727457686974656c69737465644d656d626572446f65734e6f744578697374004f04d84174206c65617374206f6e65206f66207468652077686974656c6973746564206d656d6265727320646f6573206e6f74206578697374784e66744e6f6e4368616e6e656c4f776e6572446f65734e6f744578697374005004f84e6f6e2d6368616e6e656c206f776e65722073706563696669656420647572696e67206e66742069737375616e636520646f6573206e6f74206578697374ac457874656e73696f6e506572696f644973477265617465725468656e41756374696f6e4475726174696f6e005104c4457874656e73696f6e20706572696f642069732067726561746572207468656e2061756374696f6e206475726174696f6e444e6f417373657473537065636966696564005204ac4e6f2061737365747320746f2062652072656d6f7665642068617665206265656e2073706563696669656454496e76616c696441737365747350726f7669646564005304684368616e6e656c2061737365747320666561736962696c697479544368616e6e656c436f6e7461696e73566964656f73005404584368616e6e656c20436f6e7461696e7320566964656f544368616e6e656c436f6e7461696e734173736574730055045c4368616e6e656c20436f6e7461696e73204173736574735c496e76616c696442616753697a655370656369666965640056047c4261672053697a6520737065636966696564206973206e6f742076616c6964504d6967726174696f6e4e6f7446696e6973686564005704584d6967726174696f6e206e6f7420646f6e6520796574445265706c79446f65734e6f7445786973740058046c5061727465636970616e74206973206e6f742061206d656d6265724c556e73756666696369656e7442616c616e636500590450496e73756666696369656e742062616c616e63656c496e73756666696369656e74547265617375727942616c616e6365005a0474496e73756666696369656e742074726561737572792062616c616e636554496e76616c69644d656d62657250726f7669646564005b0470496e76616c6964206d656d62657220696420207370656369666965643c4163746f724e6f74414d656d626572005c04544163746f72206973206e6f742041204d656d626572785061796d656e7450726f6f66566572696669636174696f6e4661696c6564005d04845061796d656e742050726f6f6620766572696669636174696f6e206661696c656484436173686f7574416d6f756e74457863656564734d6178696d756d416d6f756e74005e04c04368616e6e656c20636173686f757420616d6f756e7420697320746f6f206869676820746f20626520636c61696d65647c436173686f7574416d6f756e7442656c6f774d696e696d756d416d6f756e74005f04bc4368616e6e656c20636173686f757420616d6f756e7420697320746f6f206c6f7720746f20626520636c61696d6564e05769746864726177616c416d6f756e74457863656564734368616e6e656c4163636f756e74576974686472617761626c6542616c616e63650060085901416e20617474656d707420746f2077697468647261772066756e64732066726f6d206368616e6e656c206163636f756e74206661696c65642c2062656361757365207468652073706563696669656420616d6f756e744901657863656564732074686520776974686472617761626c6520616d6f756e7420286368616e6e656c206163636f756e742062616c616e6365206d696e7573206368616e6e656c20626c6f617420626f6e64297c576974686472617746726f6d4368616e6e656c416d6f756e7449735a65726f0061085901416e20617474656d707420746f2077697468647261772066756e64732066726f6d206368616e6e656c206163636f756e74206661696c65642c2062656361757365207468652073706563696669656420616d6f756e741c6973207a65726f5c4368616e6e656c436173686f75747344697361626c65640062049c4368616e6e656c20636173686f757473206172652063757272656e746c792064697361626c6564a44d696e436173686f7574416c6c6f776564457863656564734d6178436173686f7574416c6c6f77656400630809014e65772076616c75657320666f72206d696e5f636173686f75745f616c6c6f7765642f6d61785f636173686f75745f616c6c6f7765642061726520696e76616c6964d46d696e5f636173686f75745f616c6c6f7765642063616e6e6f7420657863656564206d61785f636173686f75745f616c6c6f7765648443757261746f724d6f6465726174696f6e416374696f6e4e6f74416c6c6f776564006404110143757261746f7220646f6573206e6f742068617665207065726d697373696f6e7320746f20706572666f726d20676976656e206d6f6465726174696f6e20616374696f6e944d617843757261746f725065726d697373696f6e735065724c6576656c457863656564656400650441014d6178696d756d206e756d626572206f662063757261746f72207065726d697373696f6e732070657220676976656e206368616e6e656c2070726976696c656765206c6576656c206578636565646564c043757261746f7247726f75704d61785065726d697373696f6e7342794c6576656c4d617053697a654578636565646564006604290143757261746f722067726f75702773207065726d697373696f6e73206279206c6576656c206d617020657863656564656420746865206d6178696d756d20616c6c6f7765642073697a65504368616e6e656c466561747572655061757365640067045d014f7065726174696f6e2063616e6e6f742062652065786563757465642c20626563617573652074686973206368616e6e656c206665617475726520686173206265656e2070617573656420627920612063757261746f72444368616e6e656c4261674d697373696e670068042d01556e65787065637465642072756e74696d652073746174653a206d697373696e67206368616e6e656c2062616720647572696e672064656c6574655f6368616e6e656c20617474656d70748c417373657473546f52656d6f76654265796f6e64456e74697479417373657473536574006904f5014c697374206f662061737365747320746f2072656d6f76652070726f766964656420666f72207570646174655f6368616e6e656c202f207570646174655f766964656f20636f6e7461696e7320617373657473207468617420646f6e27742062656c6f6e6720746f207468652073706563696669656420656e7469747990496e76616c6964566964656f446174614f626a65637473436f756e7450726f7669646564006a04f4496e76616c6964206e756d626572206f66206f626a6563747320746f2064656c6574652070726f766964656420666f722064656c6574655f766964656f70496e76616c69644368616e6e656c5472616e73666572537461747573006b04bc496e76616c6964206368616e6e656c207472616e736665722073746174757320666f72206f7065726174696f6e732e78496e76616c69644368616e6e656c5472616e736665724163636570746f72006c04d4496e636f7272656374206163746f7220747269657320746f2061636365707420746865206368616e6e656c207472616e736665722e98496e76616c69644368616e6e656c5472616e73666572436f6d6d69746d656e74506172616d73006d08550143616e6e6f742061636365707420746865206368616e6e656c207472616e736665723a2070726f766964656420636f6d6d69746d656e7420706172616d657465727320646f65736e2774206d617463682077697468906368616e6e656c2070656e64696e67207472616e7366657220706172616d65746572732e8c4368616e6e656c4167656e74496e73756666696369656e745065726d697373696f6e73006e004c496e76616c69644368616e6e656c4f776e6572006f04a4496e636f7272656374206368616e6e656c206f776e657220666f7220616e206f7065726174696f6e2e285a65726f5265776172640070046443616e6e6f7420636c61696d207a65726f207265776172642e78496e73756666696369656e7442616c616e6365466f725472616e73666572007104510143616e6e6f74207472616e7366657220746865206368616e6e656c3a206368616e6e656c206f776e65722068617320696e73756666696369656e742062616c616e6365202862756467657420666f72205747732994496e73756666696369656e7442616c616e6365466f724368616e6e656c4372656174696f6e0072080d0143616e6e6f742063726561746520746865206368616e6e656c3a206368616e6e656c2063726561746f722068617320696e73756666696369656e742062616c616e6365e9012862756467657420666f72206368616e6e656c20737461746520626c6f617420626f6e64202b206368616e6e656c2064617461206f626a7320737461746520626c6f617420626f6e6473202b2064617461206f626a732073746f726167652066656573202b206578697374656e7469616c206465706f736974298c496e73756666696369656e7442616c616e6365466f72566964656f4372656174696f6e007308fc43616e6e6f74206372656174652074686520766964656f3a20766964656f2063726561746f722068617320696e73756666696369656e742062616c616e6365d9012862756467657420666f7220766964656f20737461746520626c6f617420626f6e64202b20766964656f2064617461206f626a7320737461746520626c6f617420626f6e6473202b2064617461206f626a732073746f726167652066656573202b206578697374656e7469616c206465706f7369742964496e73756666696369656e74436f756e63696c4275646765740074006c476c6f62616c4e66744461696c794c696d6974457863656564656400750070476c6f62616c4e66745765656b6c794c696d69744578636565646564007600704368616e6e656c4e66744461696c794c696d69744578636565646564007700744368616e6e656c4e66745765656b6c794c696d697445786365656465640078006443726561746f72546f6b656e416c7265616479497373756564007904c443726561746f7220746f6b656e2077617320616c72656164792069737375656420666f722074686973206368616e6e656c5443726561746f72546f6b656e4e6f74497373756564007a04b043726561746f7220746f6b656e207761736e27742069737375656420666f722074686973206368616e6e656c884d656d6265724964436f756c644e6f7442654465726976656446726f6d4163746f72007b0415014d656d62657220696420636f756c64206e6f7420626520646572697665642066726f6d207468652070726f766964656420436f6e74656e744163746f7220636f6e74657874bc43616e6e6f74576974686472617746726f6d4368616e6e656c5769746843726561746f72546f6b656e497373756564007c08290143616e6e6f74206469726563746c792077697468647261772066756e64732066726f6d2061206368616e6e656c206163636f756e74207768656e20746865206368616e6e656c2068617358612063726561746f7220746f6b656e20697373756564bc506174726f6e61676543616e4f6e6c794265436c61696d6564466f724d656d6265724f776e65644368616e6e656c73007d04f4506174726f6e6167652063616e206f6e6c7920626520636c61696d6564206966206368616e6e656c206973206f776e65642062792061206d656d626572a84368616e6e656c5472616e7366657273426c6f636b6564447572696e67526576656e756553706c697473007e04cc4368616e6e656c205472616e73666572732061726520626c6f636b656420647572696e6720726576656e75652073706c6974739c4368616e6e656c5472616e7366657273426c6f636b6564447572696e67546f6b656e53616c6573007f04c04368616e6e656c205472616e73666572732061726520626c6f636b656420647572696e6720746f6b656e2073616c65730460436f6e74656e74206469726563746f7279206572726f7273fd08083870616c6c65745f73746f72616765244261675265636f7264084c53746f726167654275636b657449647353657401010960446973747269627574696f6e4275636b65744964735365740105090010012473746f7265645f62790109014c53746f726167654275636b657449647353657400013864697374726962757465645f627905090160446973747269627574696f6e4275636b65744964735365740001486f626a656374735f746f74616c5f73697a6520010c7536340001386f626a656374735f6e756d62657220010c7536340000010910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000050910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e64656442547265655365740804540109020453000004001d02012c42547265655365743c543e00000909083870616c6c65745f73746f726167654c53746f726167654275636b65745265636f72640820576f726b657249640120244163636f756e74496401000010013c6f70657261746f725f7374617475730d0901c053746f726167654275636b65744f70657261746f725374617475733c576f726b657249642c204163636f756e7449643e000148616363657074696e675f6e65775f62616773880110626f6f6c00011c766f75636865729102011c566f756368657200013461737369676e65645f6261677320010c75363400000d09083870616c6c65745f73746f726167656c53746f726167654275636b65744f70657261746f725374617475730820576f726b657249640120244163636f756e7449640100010c1c4d697373696e6700000050496e766974656453746f72616765576f726b65720400200120576f726b657249640001003453746f72616765576f726b65720800200120576f726b6572496400000001244163636f756e74496400020000110910346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e00001509083870616c6c65745f73746f726167656044796e616d69634261674372656174696f6e506f6c69637904b0446973747269627574696f6e4275636b657446616d696c79546f4e756d6265724f664275636b6574734d6170011909000801646e756d6265725f6f665f73746f726167655f6275636b65747310010c75333200012066616d696c696573190901b0446973747269627574696f6e4275636b657446616d696c79546f4e756d6265724f664275636b6574734d61700000190910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b0120045601100453000004009902013842547265654d61703c4b2c20563e00001d0900000408790220002109083870616c6c65745f73746f7261676528446174614f626a6563740448526570617961626c65426c6f6174426f6e6401c501001001206163636570746564880110626f6f6c00014073746174655f626c6f61745f626f6e64c5010148526570617961626c65426c6f6174426f6e6400011073697a6520010c75363400013c697066735f636f6e74656e745f69641109013c4261736535384d756c74696861736800002509083870616c6c65745f73746f7261676578446973747269627574696f6e4275636b657446616d696c795265636f7264045c446973747269627574696f6e4275636b6574496e6465780120000401786e6578745f646973747269627574696f6e5f6275636b65745f696e64657820015c446973747269627574696f6e4275636b6574496e64657800002909083870616c6c65745f73746f7261676560446973747269627574696f6e4275636b65745265636f72640888446973747269627574696f6e4275636b6574496e76697465644f70657261746f7273012d096c446973747269627574696f6e4275636b65744f70657261746f727301310900140148616363657074696e675f6e65775f62616773880110626f6f6c000130646973747269627574696e67880110626f6f6c00014c70656e64696e675f696e7669746174696f6e732d090188446973747269627574696f6e4275636b6574496e76697465644f70657261746f72730001246f70657261746f72733109016c446973747269627574696f6e4275636b65744f70657261746f727300013461737369676e65645f6261677320010c75363400002d0910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000310910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e00003509083870616c6c65745f73746f72616765144572726f72040454000105013c41726974686d657469634572726f72000004f447656e657269632041726974686d65746963204572726f722064756520746f20696e7465726e616c206163636f756e74696e67206f7065726174696f6e40496e76616c69644369644c656e67746800010494496e76616c696420434944206c656e67746820286d75737420626520343620627974657329444e6f4f626a656374734f6e55706c6f6164000204a0456d707479202264617461206f626a656374206372656174696f6e2220636f6c6c656374696f6e2e6053746f726167654275636b6574446f65736e744578697374000304ac546865207265717565737465642073746f72616765206275636b657420646f65736e27742065786973742e7053746f726167654275636b657449734e6f74426f756e64546f426167000404cc546865207265717565737465642073746f72616765206275636b6574206973206e6f7420626f756e6420746f2061206261672e6453746f726167654275636b65744973426f756e64546f426167000504dc546865207265717565737465642073746f72616765206275636b657420697320616c726561647920626f756e6420746f2061206261672e644e6f53746f726167654275636b6574496e7669746174696f6e0006041901496e76616c6964206f7065726174696f6e207769746820696e76697465733a207468657265206973206e6f2073746f72616765206275636b657420696e7669746174696f6e2e6453746f7261676550726f7669646572416c72656164795365740007040501496e76616c6964206f7065726174696f6e207769746820696e76697465733a2073746f726167652070726f76696465722077617320616c7265616479207365742e6053746f7261676550726f76696465724d75737442655365740008047453746f726167652070726f7669646572206d757374206265207365742e7c446966666572656e7453746f7261676550726f7669646572496e76697465640009041501496e76616c6964206f7065726174696f6e207769746820696e76697465733a20616e6f746865722073746f726167652070726f76696465722077617320696e76697465642e58496e766974656453746f7261676550726f7669646572000a041501496e76616c6964206f7065726174696f6e207769746820696e76697465733a2073746f726167652070726f76696465722077617320616c726561647920696e76697465642e8853746f726167654275636b65744964436f6c6c656374696f6e73417265456d707479000b04a053746f72616765206275636b657420696420636f6c6c656374696f6e732061726520656d7074792ed053746f726167654275636b6574734e756d62657256696f6c6174657344796e616d69634261674372656174696f6e506f6c696379000c08290153746f72616765206275636b657420696420636f6c6c656374696f6e2070726f766964656420636f6e747261646963747320746865206578697374696e672064796e616d696320626167406372656174696f6e20706f6c6963792ecc446973747269627574696f6e4275636b65747356696f6c6174657344796e616d69634261674372656174696f6e506f6c696379000d083d01446973747269627574696f6e206275636b657420696420636f6c6c656374696f6e2070726f766964656420636f6e747261646963747320746865206578697374696e672064796e616d696320626167406372656174696f6e20706f6c6963792e38456d707479436f6e74656e744964000e04b455706c6f61642064617461206572726f723a20656d70747920636f6e74656e742049442070726f76696465642e385a65726f4f626a65637453697a65000f049055706c6f61642064617461206572726f723a207a65726f206f626a6563742073697a652e88496e76616c69645374617465426c6f6174426f6e64536f757263654163636f756e74001004ec55706c6f61642064617461206572726f723a20696e76616c696420737461746520626c6f617420626f6e6420736f75726365206163636f756e742e58496e76616c696453746f7261676550726f766964657200110490496e76616c69642073746f726167652070726f766964657220666f72206275636b65742e4c496e73756666696369656e7442616c616e636500120498496e73756666696369656e742062616c616e636520666f7220616e206f7065726174696f6e2e54446174614f626a656374446f65736e7445786973740013046844617461206f626a65637420646f65736e27742065786973742e4055706c6f6164696e67426c6f636b65640014049c55706c6f6164696e67206f6620746865206e6577206f626a65637420697320626c6f636b65642e74446174614f626a6563744964436f6c6c656374696f6e4973456d7074790015048c44617461206f626a65637420696420636f6c6c656374696f6e20697320656d7074792e80536f75726365416e6444657374696e6174696f6e42616773417265457175616c001604a043616e6e6f74206d6f7665206f626a656374732077697468696e207468652073616d65206261672e54446174614f626a656374426c61636b6c6973746564001704a844617461206f626a65637420686173682069732070617274206f662074686520626c61636b6c6973742e68426c61636b6c69737453697a654c696d6974457863656564656400180478426c61636b6c6973742073697a65206c696d69742065786365656465642e84566f75636865724d61784f626a65637453697a654c696d69744578636565646564001904ac4d6178206f626a6563742073697a65206c696d697420657863656564656420666f7220766f75636865722e8c566f75636865724d61784f626a6563744e756d6265724c696d69744578636565646564001a04b44d6178206f626a656374206e756d626572206c696d697420657863656564656420666f7220766f75636865722e9453746f726167654275636b65744f626a6563744e756d6265724c696d697452656163686564001b04cc4f626a656374206e756d626572206c696d697420666f72207468652073746f72616765206275636b657420726561636865642e8c53746f726167654275636b65744f626a65637453697a654c696d697452656163686564001c04e04f626a6563747320746f74616c2073697a65206c696d697420666f72207468652073746f72616765206275636b657420726561636865642e6c496e73756666696369656e74547265617375727942616c616e6365001d04d8496e73756666696369656e74206d6f64756c652074726561737572792062616c616e636520666f7220616e206f7065726174696f6e2e8443616e6e6f7444656c6574654e6f6e456d70747953746f726167654275636b6574001e04a443616e6e6f742064656c6574652061206e6f6e2d656d7074792073746f72616765206275636b65742e68446174614f626a6563744964506172616d73417265456d707479001f04f85468652060646174615f6f626a6563745f696473602065787472696e73696320706172616d6574657220636f6c6c656374696f6e20697320656d7074792e7c53746f726167654275636b6574735065724261674c696d6974546f6f4c6f77002004d8546865206e6577206053746f726167654275636b6574735065724261674c696d697460206e756d62657220697320746f6f206c6f772e8053746f726167654275636b6574735065724261674c696d6974546f6f48696768002104dc546865206e6577206053746f726167654275636b6574735065724261674c696d697460206e756d62657220697320746f6f20686967682e8053746f726167654275636b65745065724261674c696d69744578636565646564002204cc6053746f726167654275636b6574735065724261674c696d6974602077617320657863656564656420666f722061206261672e8053746f726167654275636b6574446f65736e744163636570744e657742616773002304ac5468652073746f72616765206275636b657420646f65736e277420616363657074206e657720626167732e4044796e616d6963426167457869737473002404c843616e6e6f7420637265617465207468652064796e616d6963206261673a2064796e616d696320626167206578697374732e5444796e616d6963426167446f65736e7445786973740025046844796e616d69632062616720646f65736e27742065786973742e8853746f7261676550726f76696465724f70657261746f72446f65736e744578697374002604a053746f726167652070726f7669646572206f70657261746f7220646f65736e27742065786973742e484461746153697a654665654368616e676564002704b8496e76616c69642065787472696e7369632063616c6c3a20646174612073697a6520666565206368616e6765642e7c446174614f626a6563745374617465426c6f6174426f6e644368616e676564002804f4496e76616c69642065787472696e7369632063616c6c3a2064617461206f626a65637420737461746520626c6f617420626f6e64206368616e6765642e7843616e6e6f7444656c6574654e6f6e456d70747944796e616d69634261670029049043616e6e6f742064656c657465206e6f6e20656d7074792064796e616d6963206261672eb84d6178446973747269627574696f6e4275636b657446616d696c794e756d6265724c696d69744578636565646564002a04d44d617820646973747269627574696f6e206275636b65742066616d696c79206e756d626572206c696d69742065786365656465642e8c446973747269627574696f6e4275636b657446616d696c79446f65736e744578697374002b04a4446973747269627574696f6e206275636b65742066616d696c7920646f65736e27742065786973742e74446973747269627574696f6e4275636b6574446f65736e744578697374002c0488446973747269627574696f6e206275636b657420646f65736e27742065786973742e9c446973747269627574696f6e4275636b65744964436f6c6c656374696f6e73417265456d707479002d04b4446973747269627574696f6e206275636b657420696420636f6c6c656374696f6e732061726520656d7074792e94446973747269627574696f6e4275636b6574446f65736e744163636570744e657742616773002e04b0446973747269627574696f6e206275636b657420646f65736e277420616363657074206e657720626167732eb84d6178446973747269627574696f6e4275636b65744e756d6265725065724261674c696d69744578636565646564002f04d84d617820646973747269627574696f6e206275636b6574206e756d6265722070657220626167206c696d69742065786365656465642e84446973747269627574696f6e4275636b657449734e6f74426f756e64546f426167003004a8446973747269627574696f6e206275636b6574206973206e6f7420626f756e6420746f2061206261672e78446973747269627574696f6e4275636b65744973426f756e64546f42616700310498446973747269627574696f6e206275636b657420697320626f756e6420746f2061206261672e90446973747269627574696f6e4275636b6574735065724261674c696d6974546f6f4c6f77003204ec546865206e65772060446973747269627574696f6e4275636b6574735065724261674c696d697460206e756d62657220697320746f6f206c6f772e94446973747269627574696f6e4275636b6574735065724261674c696d6974546f6f48696768003304f0546865206e65772060446973747269627574696f6e4275636b6574735065724261674c696d697460206e756d62657220697320746f6f20686967682e9c446973747269627574696f6e50726f76696465724f70657261746f72446f65736e744578697374003404b4446973747269627574696f6e2070726f7669646572206f70657261746f7220646f65736e27742065786973742ea8446973747269627574696f6e50726f76696465724f70657261746f72416c7265616479496e7669746564003504bc446973747269627574696f6e2070726f7669646572206f70657261746f7220616c726561647920696e76697465642e7c446973747269627574696f6e50726f76696465724f70657261746f72536574003604ac446973747269627574696f6e2070726f7669646572206f70657261746f7220616c7265616479207365742e784e6f446973747269627574696f6e4275636b6574496e7669746174696f6e003704884e6f20646973747269627574696f6e206275636b657420696e7669746174696f6e2eac4d7573744265446973747269627574696f6e50726f76696465724f70657261746f72466f724275636b65740038042901496e76616c6964206f7065726174696f6e733a206d757374206265206120646973747269627574696f6e2070726f7669646572206f70657261746f7220666f722061206275636b65742ef84d61784e756d6265724f6650656e64696e67496e7669746174696f6e734c696d6974466f72446973747269627574696f6e4275636b65745265616368656400390429014d6178206e756d626572206f662070656e64696e6720696e7669746174696f6e73206c696d697420666f72206120646973747269627574696f6e206275636b657420726561636865642ec04d61784e756d6265724f664f70657261746f7273506572446973747269627574696f6e4275636b657452656163686564003a04e84d6178206e756d626572206f66206f70657261746f727320666f72206120646973747269627574696f6e206275636b657420726561636865642ea8446973747269627574696f6e46616d696c79426f756e64546f4261674372656174696f6e506f6c696379003b04cc446973747269627574696f6e2066616d696c7920626f756e6420746f206120626167206372656174696f6e20706f6c6963792e644d6178446174614f626a65637453697a654578636565646564003c04784d61782064617461206f626a6563742073697a652065786365656465642e60496e76616c69645472616e736163746f724163636f756e74003d04b8496e76616c6964207472616e736163746f72206163636f756e7420494420666f722074686973206275636b65742ec04e756d6265724f6653746f726167654275636b6574734f7574736964654f66416c6c6f776564436f6e747261696e7473003e049c4e6f7420616c6c6f77656420276e756d626572206f662073746f72616765206275636b65747327d44e756d6265724f66446973747269627574696f6e4275636b6574734f7574736964654f66416c6c6f776564436f6e747261696e7473003f04b04e6f7420616c6c6f77656420276e756d626572206f6620646973747269627574696f6e206275636b657473273043616c6c44697361626c65640040043443616c6c2044697361626c6564048053746f72616765206d6f64756c6520707265646566696e6564206572726f727339090c5070616c6c65745f70726f6a6563745f746f6b656e1474797065732c4163636f756e7444617461101c42616c616e63650118345374616b696e67537461747573013d0948526570617961626c65426c6f6174426f6e6401c5014056657374696e675363686564756c65730141090018014476657374696e675f7363686564756c65734109014056657374696e675363686564756c6573000118616d6f756e7418011c42616c616e636500015073706c69745f7374616b696e675f737461747573550901544f7074696f6e3c5374616b696e675374617475733e000128626c6f61745f626f6e64c5010148526570617961626c65426c6f6174426f6e640001606e6578745f76657374696e675f7472616e736665725f696420010c7536340001806c6173745f73616c655f746f74616c5f7075726368617365645f616d6f756e74590901784f7074696f6e3c28546f6b656e53616c6549642c2042616c616e6365293e00003d090c5070616c6c65745f70726f6a6563745f746f6b656e147479706573345374616b696e67537461747573041c42616c616e636501180008012073706c69745f6964100138526576656e756553706c69744964000118616d6f756e7418011c42616c616e63650000410910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f6d61703c426f756e64656442547265654d61700c044b01f50204560145090453000004004909013842547265654d61703c4b2c20563e000045090c5070616c6c65745f70726f6a6563745f746f6b656e1474797065733c56657374696e675363686564756c65082c426c6f636b4e756d62657201101c42616c616e63650118001401686c696e6561725f76657374696e675f73746172745f626c6f636b10012c426c6f636b4e756d62657200015c6c696e6561725f76657374696e675f6475726174696f6e10012c426c6f636b4e756d626572000130636c6966665f616d6f756e7418011c42616c616e636500015c706f73745f636c6966665f746f74616c5f616d6f756e7418011c42616c616e63650001346275726e65645f616d6f756e7418011c42616c616e636500004909042042547265654d617008044b01f50204560145090004004d090000004d09000002510900510900000408f502450900550904184f7074696f6e040454013d090108104e6f6e6500000010536f6d6504003d090000010000590904184f7074696f6e040454015d090108104e6f6e6500000010536f6d6504005d0900000100005d090000040810180061090c5070616c6c65745f70726f6a6563745f746f6b656e14747970657324546f6b656e44617461141c42616c616e63650118104861736801242c426c6f636b4e756d626572011024546f6b656e53616c6501050344526576656e756553706c69745374617465016509002c0130746f74616c5f737570706c7918011c42616c616e6365000134746f6b656e735f69737375656418011c42616c616e63650001306e6578745f73616c655f696410012c546f6b656e53616c65496400011073616c65710901444f7074696f6e3c546f6b656e53616c653e00013c7472616e736665725f706f6c696379a90201505472616e73666572506f6c6963793c486173683e00011873796d626f6c24011048617368000138706174726f6e6167655f696e666f7509018c506174726f6e616765446174613c42616c616e63652c20426c6f636b4e756d6265723e00013c6163636f756e74735f6e756d62657220010c753634000148726576656e75655f73706c69745f72617465b902011c5065726d696c6c000134726576656e75655f73706c697465090144526576656e756553706c697453746174650001546e6578745f726576656e75655f73706c69745f6964100138526576656e756553706c69744964000065090c5070616c6c65745f70726f6a6563745f746f6b656e14747970657344526576656e756553706c6974537461746508284a6f7942616c616e636501182c426c6f636b4e756d6265720110010820496e616374697665000000184163746976650400690901a4526576656e756553706c6974496e666f3c4a6f7942616c616e63652c20426c6f636b4e756d6265723e0001000069090c5070616c6c65745f70726f6a6563745f746f6b656e14747970657340526576656e756553706c6974496e666f08284a6f7942616c616e636501182c426c6f636b4e756d6265720110000c0128616c6c6f636174696f6e1801284a6f7942616c616e636500012074696d656c696e656d09015454696d656c696e653c426c6f636b4e756d6265723e0001446469766964656e64735f636c61696d65641801284a6f7942616c616e636500006d090c5070616c6c65745f70726f6a6563745f746f6b656e1474797065732054696d656c696e65042c426c6f636b4e756d626572011000080114737461727410012c426c6f636b4e756d6265720001206475726174696f6e10012c426c6f636b4e756d6265720000710904184f7074696f6e0404540105030108104e6f6e6500000010536f6d6504000503000001000075090c5070616c6c65745f70726f6a6563745f746f6b656e14747970657334506174726f6e61676544617461081c42616c616e636501182c426c6f636b4e756d6265720110000c01107261746579090124426c6f636b52617465000180756e636c61696d65645f706174726f6e6167655f74616c6c795f616d6f756e7418011c42616c616e63650001906c6173745f756e636c61696d65645f706174726f6e6167655f74616c6c795f626c6f636b10012c426c6f636b4e756d626572000079090c5070616c6c65745f70726f6a6563745f746f6b656e14747970657324426c6f636b52617465000004000903012c5065727175696e74696c6c00007d090c5070616c6c65745f70726f6a6563745f746f6b656e186572726f7273144572726f720404540001c43c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f772980496e73756666696369656e745472616e736665727261626c6542616c616e636500010481014163636f756e742773207472616e736665727261626c652062616c616e636520697320696e73756666696369656e7420746f20706572666f726d20746865207472616e73666572206f7220696e697469616c697a6520746f6b656e2073616c6544546f6b656e446f65734e6f7445786973740002047852657175657374656420746f6b656e20646f6573206e6f74206578697374784163636f756e74496e666f726d6174696f6e446f65734e6f74457869737400030494526571756573746564206163636f756e74206461746120646f6573206e6f74206578697374784d65726b6c6550726f6f66566572696669636174696f6e4661696c757265000404804d65726b6c652070726f6f6620766572696669636174696f6e206661696c6564a8546172676574506174726f6e6167655261746549734869676865725468616e43757272656e7452617465000504c4546172676574205261746520697320686967686572207468616e2063757272656e7420706174726f6e61676520726174655c546f6b656e53796d626f6c416c7265616479496e5573650006045453796d626f6c20616c726561647920696e2075736590496e697469616c416c6c6f636174696f6e546f4e6f6e4578697374696e674d656d62657200070441014174206c65617374206f6e65206f6620746865206d656d626572732070726f76696465642061732070617274206f6620496e697469616c416c6c6f636174696f6e20646f6573206e6f74206578697374504163636f756e74416c7265616479457869737473000804584163636f756e7420416c726561647920657869737473945472616e7366657244657374696e6174696f6e4d656d626572446f65734e6f744578697374000904985472616e736665722064657374696e6174696f6e206d656d62657220696420696e76616c69646c546f6b656e49737375616e63654e6f74496e49646c655374617465000a04a8546f6b656e27732063757272656e74206f66666572696e67207374617465206973206e6f742049646c6558496e73756666696369656e744a6f7942616c616e6365000b04dc496e73756666696369656e74204a4f592042616c616e636520746f20636f76657220746865207472616e73616374696f6e20636f7374736c4a6f795472616e736665725375626a656374546f44757374696e67000c045d0154686520616d6f756e74206f66204a4f5920746f206265207472616e73666572726564206973206e6f7420656e6f75676820746f206b656570207468652064657374696e6174696f6e206163636f756e7420616c697665cc417474656d7074546f52656d6f76654e6f6e4f776e65644163636f756e74556e6465725065726d697373696f6e65644d6f6465000d04ec417474656d707420746f2072656d6f7665206e6f6e206f776e6564206163636f756e7420756e646572207065726d697373696f6e6564206d6f646578417474656d7074546f52656d6f76654e6f6e456d7074794163636f756e74000e04e4417474656d707420746f2072656d6f766520616e206163636f756e74207769746820736f6d65206f75747374616e64696e6720746f6b656e739c43616e6e6f744a6f696e57686974656c697374496e5065726d697373696f6e6c6573734d6f6465000f04b043616e6e6f74206a6f696e2077686974656c69737420696e207065726d697373696f6e6c657373206d6f6465a443616e6e6f7444656973737565546f6b656e576974684f75747374616e64696e674163636f756e7473001004b843616e6e6f74204465697373756520546f6b656e2077697468206f75747374616e64696e67206163636f756e7473384e6f5570636f6d696e6753616c650011047854686520746f6b656e20686173206e6f207570636f6d696e672073616c65304e6f41637469766553616c65001204a854686520746f6b656e20686173206e6f206163746976652073616c6520617420746865206d6f6d656e748c496e73756666696369656e7442616c616e6365466f72546f6b656e507572636861736500130401014163636f756e742773204a4f592062616c616e636520697320696e73756666696369656e7420746f206d616b652074686520746f6b656e207075726368617365544e6f74456e6f756768546f6b656e734f6e53616c650014047d01416d6f756e74206f6620746f6b656e7320746f207075726368617365206f6e2073616c65206578636565647320746865207175616e74697479206f6620746f6b656e73207374696c6c20617661696c61626c65206f6e207468652073616c656853616c655374617274696e67426c6f636b496e54686550617374001504b05370656369666965642073616c65207374617274696e6720626c6f636b20697320696e2074686520706173745c53616c6541636365737350726f6f66526571756972656400160481014f6e6c792077686974656c6973746564207061727469636970616e74732061726520616c6c6f77656420746f20616363657373207468652073616c652c207468657265666f7265206163636573732070726f6f662069732072657175697265649453616c6541636365737350726f6f665061727469636970616e7449734e6f7453656e64657200170829015061727469636970616e7420696e2073616c65206163636573732070726f6f662070726f766964656420647572696e67206070757263686173655f746f6b656e735f6f6e5f73616c656084646f6573206e6f74206d61746368207468652073656e646572206163636f756e745c53616c6550757263686173654361704578636565646564001808610153616c65207061727469636970616e742773206361702028656974686572206361705f7065725f6d656d626572206f722077686974656c6973746564207061727469636970616e742773207370656369666963206361702978776173206578636565646564207769746820746865207075726368617365b04d617856657374696e675363686564756c65735065724163636f756e74506572546f6b656e52656163686564001908c843616e6e6f742061646420616e6f746865722076657374696e67207363686564756c6520746f20616e206163636f756e742e31014d6178696d756d206e756d626572206f662076657374696e67207363686564756c657320666f722074686973206163636f756e742d746f6b656e20706169722077617320726561636865642e6050726576696f757353616c654e6f7446696e616c697a6564001a04e450726576696f75732073616c6520776173207374696c6c206e6f742066696e616c697a65642c2066696e616c697a652069742066697273742e444e6f546f6b656e73546f5265636f766572001b041501546865726520617265206e6f2072656d61696e696e6720746f6b657320746f207265636f7665722066726f6d207468652070726576696f757320746f6b656e2073616c652e5053616c654475726174696f6e546f6f53686f7274001c04dc5370656369666965642073616c65206475726174696f6e2069732073686f72746572207468616e204d696e53616c654475726174696f6e4853616c654475726174696f6e49735a65726f001d047053616c65206475726174696f6e2063616e6e6f74206265207a65726f7053616c655570706572426f756e645175616e7469747949735a65726f001e048c557070657220626f756e64207175616e746974792063616e6e6f74206265207a65726f5853616c654361705065724d656d62657249735a65726f001f049850757263686173652063617020706572206d656d6265722063616e6e6f74206265207a65726f4c53616c65556e6974507269636549735a65726f00200484546f6b656e277320756e69742070726963652063616e6e6f74206265207a65726f6053616c655075726368617365416d6f756e7449735a65726f002104cc416d6f756e74206f6620746f6b656e7320746f207075726368617365206f6e2073616c652063616e6e6f74206265207a65726f7c526576656e756553706c697454696d65546f5374617274546f6f53686f7274002204d453706563696669656420726576656e75652073706c6974207374617274696e6720626c6f636b20697320696e20746865207061737470526576656e756553706c69744475726174696f6e546f6f53686f72740023048c526576656e75652053706c6974206475726174696f6e20697320746f6f2073686f727484526576656e756553706c6974416c7265616479416374697665466f72546f6b656e002404a8417474656d707420746f2061637469766174652073706c69742077697468206f6e65206f6e676f696e6774526576656e756553706c69744e6f74416374697665466f72546f6b656e0025043501417474656d707420746f206d616b6520726576656e75652073706c6974206f7065726174696f6e73207769746820746f6b656e206e6f7420696e206163746976652073706c697420737461746554526576656e756553706c69744469644e6f74456e640026047c526576656e75652053706c697420686173206e6f7420656e6465642079657458526576656e756553706c69744e6f744f6e676f696e67002704bc526576656e75652053706c697420666f7220746f6b656e206163746976652c20627574206e6f74206f6e676f696e676055736572416c726561647950617274696369706174696e67002804bc5573657220616c72656164792070617274696369706174696e6720696e2074686520726576656e75652073706c6974a0496e73756666696369656e7442616c616e6365466f7253706c697450617274696369706174696f6e0029041d015573657220646f6573206e6f7420706f7373657320656e6f7567682062616c616e636520746f20706172746963697061746520696e2074686520726576656e75652073706c69747c557365724e6f745061727469636970616e74696e67496e416e7953706c6974002a049855736572206973206e6f742070617274696369706174696e6720696e20616e792073706c69749843616e6e6f745061727469636970617465496e53706c6974576974685a65726f416d6f756e74002b04e8417474656d707420746f20706172746963697061746520696e20612073706c69742077697468207a65726f20746f6b656e20746f207374616b65a043616e6e6f74497373756553706c6974576974685a65726f416c6c6f636174696f6e416d6f756e74002c04dc417474656d707420746f20697373756520696e20612073706c69742077697468207a65726f20616c6c6f636174696f6e20616d6f756e74b043616e6e6f744d6f64696679537570706c795768656e526576656e756553706c697473417265416374697665002d04d4417474656d707420746f206d6f6469667920737570706c79207768656e20726576656e75652073706c69742069732061637469766558526576656e756553706c69745261746549735a65726f002e0478526576656e75652073706c697420726174652063616e6e6f742062652030404275726e416d6f756e7449735a65726f002f047c50726f766964656420616d6f756e7420746f206275726e206973203d3d2030a04275726e416d6f756e74477265617465725468616e4163636f756e74546f6b656e73416d6f756e740030043101416d6f756e74206f6620746f6b656e7320746f206275726e206578636565647320746f74616c20616d6f756e74206f6620746f6b656e73206f776e656420627920746865206163636f756e740081090c5c70616c6c65745f70726f706f73616c735f656e67696e651474797065732050726f706f73616c102c426c6f636b4e756d62657201102850726f706f736572496401201c42616c616e63650118244163636f756e744964010000200128706172616d6574657273850901a050726f706f73616c506172616d65746572733c426c6f636b4e756d6265722c2042616c616e63653e00012c70726f706f7365725f696420012850726f706f73657249640001306163746976617465645f617410012c426c6f636b4e756d6265720001187374617475731103016c50726f706f73616c5374617475733c426c6f636b4e756d6265723e000138766f74696e675f726573756c747389090134566f74696e67526573756c747300015465786163745f657865637574696f6e5f626c6f636be501014c4f7074696f6e3c426c6f636b4e756d6265723e00016c6e725f6f665f636f756e63696c5f636f6e6669726d6174696f6e7310010c7533320001487374616b696e675f6163636f756e745f6964e801444f7074696f6e3c4163636f756e7449643e000085090c5c70616c6c65745f70726f706f73616c735f656e67696e651474797065734850726f706f73616c506172616d6574657273082c426c6f636b4e756d62657201101c42616c616e6365011800200134766f74696e675f706572696f6410012c426c6f636b4e756d62657200013067726163655f706572696f6410012c426c6f636b4e756d626572000168617070726f76616c5f71756f72756d5f70657263656e7461676510010c753332000174617070726f76616c5f7468726573686f6c645f70657263656e7461676510010c753332000168736c617368696e675f71756f72756d5f70657263656e7461676510010c753332000174736c617368696e675f7468726573686f6c645f70657263656e7461676510010c75333200013872657175697265645f7374616b653101013c4f7074696f6e3c42616c616e63653e000144636f6e737469747574696f6e616c69747910010c753332000089090c5c70616c6c65745f70726f706f73616c735f656e67696e6514747970657334566f74696e67526573756c7473000010012c61627374656e74696f6e7310010c753332000124617070726f76616c7310010c75333200012872656a656374696f6e7310010c75333200011c736c617368657310010c75333200008d0910346672616d655f737570706f72741c73746f726167652c626f756e6465645f76656328426f756e64656456656308045401080453000004002801185665633c543e00009109000004081020009509085c70616c6c65745f70726f706f73616c735f656e67696e65144572726f7204045400015c3c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f772948456d7074795469746c6550726f76696465640001049050726f706f73616c2063616e6e6f74206861766520616e20656d707479207469746c652260456d7074794465736372697074696f6e50726f76696465640002048850726f706f73616c2063616e6e6f74206861766520616e20656d70747920626f6479385469746c654973546f6f4c6f6e67000304445469746c6520697320746f6f206c6f6e67504465736372697074696f6e4973546f6f4c6f6e670004045c4465736372697074696f6e20697320746f6f206c6f6e674050726f706f73616c4e6f74466f756e640005046c5468652070726f706f73616c20646f6573206e6f742065786973744450726f706f73616c46696e616c697a65640006047450726f706f73616c2069732066696e616c697a656420616c726561647930416c7265616479566f7465640007049c5468652070726f706f73616c2068617665206265656e20616c726561647920766f746564206f6e244e6f74417574686f72000804344e6f7420616e20617574686f727c4d617841637469766550726f706f73616c4e756d6265724578636565646564000904904d6178206163746976652070726f706f73616c73206e756d62657220657863656564656428456d7074795374616b65000a04a05374616b652063616e6e6f7420626520656d707479207769746820746869732070726f706f73616c485374616b6553686f756c644265456d707479000b049c5374616b652073686f756c6420626520656d70747920666f7220746869732070726f706f73616c605374616b654469666665727346726f6d5265717569726564000c04b05374616b6520646966666572732066726f6d207468652070726f706f73616c20726571756972656d656e747384496e76616c6964506172616d65746572417070726f76616c5468726573686f6c64000d0484417070726f76616c207468726573686f6c642063616e6e6f74206265207a65726f84496e76616c6964506172616d65746572536c617368696e675468726573686f6c64000e0484536c617368696e67207468726573686f6c642063616e6e6f74206265207a65726f4452657175697265526f6f744f726967696e000f04845265717569726520726f6f74206f726967696e20696e2065787472696e736963734050726f706f73616c486173566f746573001004f4446973616c6c6f7720746f2063616e63656c207468652070726f706f73616c2069662074686572652061726520616e7920766f746573206f6e2069742e5c5a65726f4578616374457865637574696f6e426c6f636b00110494457861637420657865637574696f6e20626c6f636b2063616e6e6f74206265207a65726f2e68496e76616c69644578616374457865637574696f6e426c6f636b001204e0457861637420657865637574696f6e20626c6f636b2063616e6e6f74206265206c657373207468616e2063757272656e745f626c6f636b2e6c496e73756666696369656e7442616c616e6365466f725374616b65001304a05468657265206973206e6f7420656e6f7567682062616c616e636520666f722061207374616b652e44436f6e666c696374696e675374616b6573001404bc54686520636f6e666c696374696e67207374616b6520646973636f76657265642e2043616e6e6f74207374616b652e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001504ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e8c4d6178446973706174636861626c6543616c6c436f646553697a6545786365656465640016043d015468652073697a65206f6620656e636f64656420646973706174636861626c652063616c6c20746f206265206578656375746564206279207468652070726f706f73616c20697320746f6f20626967047c456e67696e65206d6f64756c6520707265646566696e6564206572726f727399090c6c70616c6c65745f70726f706f73616c735f64697363757373696f6e1474797065734044697363757373696f6e5468726561640c204d656d626572496401202c426c6f636b4e756d62657201103c54687265616457686974656c697374019d09000c01306163746976617465645f617410012c426c6f636b4e756d626572000124617574686f725f69642001204d656d62657249640001106d6f6465a109016c5468726561644d6f64653c54687265616457686974656c6973743e00009d0910346672616d655f737570706f72741c73746f7261676544626f756e6465645f62747265655f7365743c426f756e646564425472656553657408045401200453000004004d01012c42547265655365743c543e0000a1090c6c70616c6c65745f70726f706f73616c735f64697363757373696f6e147479706573285468726561644d6f6465043c54687265616457686974656c697374019d090108104f70656e00000018436c6f73656404009d09013c54687265616457686974656c69737400010000a5090c6c70616c6c65745f70726f706f73616c735f64697363757373696f6e1474797065733844697363757373696f6e506f73740c204d656d626572496401202c426c6f636b4e756d626572011048526570617961626c65426c6f6174426f6e6401c501000c0124617574686f725f69642001204d656d626572496400013c636c65616e75705f7061795f6f6666c5010148526570617961626c65426c6f6174426f6e6400012c6c6173745f65646974656410012c426c6f636b4e756d6265720000a909086c70616c6c65745f70726f706f73616c735f64697363757373696f6e144572726f720404540001283c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f772944546872656164446f65736e7445786973740001045054687265616420646f65736e27742065786973743c506f7374446f65736e74457869737400020448506f737420646f65736e27742065786973744452657175697265526f6f744f726967696e000304845265717569726520726f6f74206f726967696e20696e2065787472696e736963736043616e6e6f74506f73744f6e436c6f7365645468726561640004046501546865207468726561642068617320436c6f736564206d6f64652e20416e6420706f737420617574686f7220646f65736e27742062656c6f6e6720746f20636f756e63696c206f7220616c6c6f776564206d656d626572732e504e6f74417574686f724f72436f756e63696c6f720005049453686f756c642062652074687265616420617574686f72206f7220636f756e63696c6f722e604d617857686974654c69737453697a654578636565646564000604a04d617820616c6c6f77656420617574686f7273206c697374206c696d69742065786365656465642e7457686974656c69737465644d656d626572446f65734e6f74457869737400070849014174206c65617374206f6e65206f6620746865206d656d626572206964732070726f76696465642061732070617274206f6620636c6f736564207468726561642077686974656c6973742062656c6f6e677364746f2061206e6f6e2d6578697374696e67206d656d6265722e68496e73756666696369656e7442616c616e6365466f72506f7374000804c44163636f756e742068617320696e73756666696369656e742062616c616e636520746f20637265617465206120706f73744043616e6e6f7444656c657465506f73740009049c4163636f756e742063616e27742064656c65746520706f737420617420746865206d6f6d656e74048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273ad09085870616c6c65745f70726f706f73616c735f636f646578144572726f72040454000168545369676e616c50726f706f73616c4973456d707479000004a050726f7669646564207465787420666f7220746578742070726f706f73616c20697320656d7074795852756e74696d6550726f706f73616c4973456d707479000104f050726f7669646564205741534d20636f646520666f72207468652072756e74696d6520757067726164652070726f706f73616c20697320656d70747990496e76616c696446756e64696e675265717565737450726f706f73616c42616c616e6365000204bc496e76616c69642062616c616e63652076616c756520666f7220746865207370656e64696e672070726f706f73616c54496e76616c696456616c696461746f72436f756e74000304f8496e76616c69642076616c696461746f7220636f756e7420666f722074686520277365742076616c696461746f7220636f756e74272070726f706f73616c4452657175697265526f6f744f726967696e000404845265717569726520726f6f74206f726967696e20696e2065787472696e73696373a8496e76616c6964436f756e63696c456c656374696f6e506172616d65746572436f756e63696c53697a65000504c4496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20636f756e63696c5f73697a65b4496e76616c6964436f756e63696c456c656374696f6e506172616d6574657243616e6469646163794c696d6974000604d0496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d2063616e6469646163792d6c696d6974b4496e76616c6964436f756e63696c456c656374696f6e506172616d657465724d696e566f74696e675374616b65000704d4496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206d696e2d766f74696e675f7374616b65b8496e76616c6964436f756e63696c456c656374696f6e506172616d657465724e65775465726d4475726174696f6e000804d8496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206e65775f7465726d5f6475726174696f6eb8496e76616c6964436f756e63696c456c656374696f6e506172616d657465724d696e436f756e63696c5374616b65000904d8496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d206d696e5f636f756e63696c5f7374616b65b8496e76616c6964436f756e63696c456c656374696f6e506172616d6574657252657665616c696e67506572696f64000a04d4496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d2072657665616c696e675f706572696f64ac496e76616c6964436f756e63696c456c656374696f6e506172616d65746572566f74696e67506572696f64000b04c8496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20766f74696e675f706572696f64bc496e76616c6964436f756e63696c456c656374696f6e506172616d65746572416e6e6f756e63696e67506572696f64000c04d8496e76616c696420636f756e63696c20656c656374696f6e20706172616d65746572202d20616e6e6f756e63696e675f706572696f6484496e76616c6964576f726b696e6747726f75704275646765744361706163697479000d04bc496e76616c696420776f726b696e672067726f75702062756467657420636170616369747920706172616d65746572a0496e76616c69645365744c656164506172616d6574657243616e6e6f744265436f756e63696c6f72000e042d01496e76616c69642027736574206c6561642070726f706f73616c2720706172616d65746572202d2070726f706f736564206c6561642063616e6e6f74206265206120636f756e63696c6f724c536c617368696e675374616b6549735a65726f000f042101496e76616c69642027736c617368207374616b652070726f706f73616c2720706172616d65746572202d2063616e6e6f7420736c617368206279207a65726f2062616c616e63652e5444656372656173696e675374616b6549735a65726f0010043901496e76616c696420276465637265617365207374616b652070726f706f73616c2720706172616d65746572202d2063616e6e6f74206465637265617365206279207a65726f2062616c616e63652e80496e73756666696369656e7446756e6473466f724275646765745570646174650011041d01496e73756666696369656e742066756e647320666f72202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20657865637574696f6eb0496e76616c696446756e64696e675265717565737450726f706f73616c4e756d6265724f664163636f756e740012045101496e76616c6964206e756d626572206f66206163636f756e747320726563696576696e672066756e64696e67207265717565737420666f72202746756e64696e672052657175657374272070726f706f73616c2eb0496e76616c696446756e64696e675265717565737450726f706f73616c52657065617465644163636f756e74001304bc5265706561746564206163636f756e7420696e202746756e64696e672052657175657374272070726f706f73616c2ee0496e76616c69644368616e6e656c5061796f75747350726f706f73616c4d696e436173686f7574457863656564734d6178436173686f7574001404e50154686520737065636966696564206d696e206368616e6e656c20636173686f75742069732067726561746572207468616e2074686520737065636966696564206d6178206368616e6e656c20636173686f757420696e2060557064617465204368616e6e656c205061796f757473602070726f706f73616c2e4c496e76616c69644c656164576f726b657249640015049050726f7669646564206c65616420776f726b6572206964206973206e6f742076616c696450496e76616c69644c6561644f70656e696e6749640016049450726f7669646564206c656164206f70656e696e67206964206973206e6f742076616c696460496e76616c69644c6561644170706c69636174696f6e4964001704a450726f7669646564206c656164206170706c69636174696f6e206964206973206e6f742076616c696444496e76616c696450726f706f73616c49640018048450726f76696465642070726f706f73616c206964206973206e6f742076616c69643c41726974686d657469634572726f720019043c41726974686d656963204572726f720478436f646578206d6f64756c6520707265646566696e6564206572726f7273b1090c5070616c6c65745f776f726b696e675f67726f75701474797065731c4f70656e696e670c2c426c6f636b4e756d62657201101c42616c616e6365011810486173680124001801306f70656e696e675f747970656103012c4f70656e696e675479706500011c6372656174656410012c426c6f636b4e756d6265720001406465736372697074696f6e5f68617368240110486173680001307374616b655f706f6c696379450301845374616b65506f6c6963793c426c6f636b4e756d6265722c2042616c616e63653e0001407265776172645f7065725f626c6f636b3101013c4f7074696f6e3c42616c616e63653e0001386372656174696f6e5f7374616b6518011c42616c616e63650000b5090c5070616c6c65745f776f726b696e675f67726f7570147479706573384a6f624170706c69636174696f6e0c244163636f756e7449640100204d656d62657249640120104861736801240018013c726f6c655f6163636f756e745f69640001244163636f756e7449640001447265776172645f6163636f756e745f69640001244163636f756e7449640001487374616b696e675f6163636f756e745f69640001244163636f756e7449640001246d656d6265725f69642001204d656d62657249640001406465736372697074696f6e5f68617368240110486173680001286f70656e696e675f69642001244f70656e696e6749640000b9090c5070616c6c65745f776f726b696e675f67726f75701474797065732c47726f7570576f726b657210244163636f756e7449640100204d656d626572496401202c426c6f636b4e756d62657201101c42616c616e63650118002401246d656d6265725f69642001204d656d626572496400013c726f6c655f6163636f756e745f69640001244163636f756e7449640001487374616b696e675f6163636f756e745f69640001244163636f756e7449640001447265776172645f6163636f756e745f69640001244163636f756e744964000148737461727465645f6c656176696e675f6174e501014c4f7074696f6e3c426c6f636b4e756d6265723e0001506a6f625f756e7374616b696e675f706572696f6410012c426c6f636b4e756d6265720001407265776172645f7065725f626c6f636b3101013c4f7074696f6e3c42616c616e63653e0001346d69737365645f7265776172643101013c4f7074696f6e3c42616c616e63653e000128637265617465645f617410012c426c6f636b4e756d6265720000bd090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273c1090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273c5090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273c9090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273cd090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273d1090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273d5090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273d9090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273dd090c5070616c6c65745f776f726b696e675f67726f7570186572726f7273144572726f720804540004490001803c41726974686d657469634572726f72000004c8556e65787065637465642061726974686d65746963206572726f7220286f766572666c6f77202f20756e646572666c6f7729605374616b6542616c616e636543616e6e6f7442655a65726f0001049850726f7669646564207374616b652062616c616e63652063616e6e6f74206265207a65726f2e4c4f70656e696e67446f65734e6f7445786973740002045c4f70656e696e6720646f6573206e6f742065786973742e6443616e6e6f74486972654d756c7469706c654c656164657273000304bc43616e6e6f742066696c6c206f70656e696e672077697468206d756c7469706c65206170706c69636174696f6e732e74576f726b65724170706c69636174696f6e446f65734e6f74457869737400040488576f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e744d6178416374697665576f726b65724e756d626572457863656564656400050488576f726b696e672067726f75702073697a65206c696d69742065786365656465642e9c5375636365737366756c576f726b65724170706c69636174696f6e446f65734e6f744578697374000604b45375636365737366756c20776f726b6572206170706c69636174696f6e20646f6573206e6f742065786973742e8043616e6e6f74486972654c65616465725768656e4c6561646572457869737473000704c45468657265206973206c656164657220616c72656164792c2063616e6e6f74206869726520616e6f74686572206f6e652e4049734e6f744c6561644163636f756e740008044c4e6f742061206c656164206163636f756e742e4443757272656e744c6561644e6f745365740009046043757272656e74206c656164206973206e6f74207365742e48576f726b6572446f65734e6f744578697374000a0458576f726b657220646f6573206e6f742065786973742e4c496e76616c69644d656d6265724f726967696e000b0470496e76616c6964206f726967696e20666f722061206d656d6265722e705369676e657249734e6f74576f726b6572526f6c654163636f756e74000c04885369676e6572206973206e6f7420776f726b657220726f6c65206163636f756e742e4842656c6f774d696e696d756d5374616b6573000d04885374616b696e67206c657373207468616e20746865206c6f77657220626f756e642e7c496e73756666696369656e7442616c616e6365546f436f7665725374616b65000e0490496e73756666696369656e742062616c616e636520746f20636f766572207374616b652e884170706c69636174696f6e5374616b65446f65736e744d617463684f70656e696e67000f04d84170706c69636174696f6e207374616b65206973206c657373207468616e207265717569726564206f70656e696e67207374616b652e504f726967696e49734e6f744170706c6963616e74001004604f726967696e206973206e6f74206170706c6963616e742e3c576f726b657249734c656176696e6700110498496e76616c6964206f7065726174696f6e202d20776f726b6572206973206c656176696e672e5043616e6e6f74526577617264576974685a65726f0012046452657761726420636f756c64206e6f74206265207a65726f2e78496e76616c69645374616b696e674163636f756e74466f724d656d626572001304ac5374616b696e67206163636f756e7420646f65736e27742062656c6f6e6720746f2061206d656d6265722e5c436f6e666c6963745374616b65734f6e4163636f756e74001404b05374616b696e67206163636f756e7420636f6e7461696e7320636f6e666c696374696e67207374616b65732e44576f726b65724861734e6f5265776172640015047c576f726b657220686173206e6f20726563757272696e67207265776172642e78556e7374616b696e67506572696f644c6573735468616e4d696e696d756d001604090153706563696669656420756e7374616b696e6720706572696f64206973206c657373207468656e206d696e696d756d2073657420666f72207468652067726f75702e3c43616e6e6f745370656e645a65726f00170460496e76616c6964207370656e64696e6720616d6f756e742e74496e73756666696369656e74427564676574466f725370656e64696e67001804a449742773206e6f7420656e6f7567682062756467657420666f722074686973207370656e64696e672e584e6f4170706c69636174696f6e7350726f7669646564001904bc43616e6e6f742066696c6c206f70656e696e67202d206e6f206170706c69636174696f6e732070726f76696465642ea043616e6e6f7444656372656173655374616b6544656c7461477265617465725468616e5374616b65001a04fc43616e6e6f74206465637265617365207374616b65202d207374616b652064656c74612067726561746572207468616e20696e697469616c207374616b652e644170706c69636174696f6e734e6f74466f724f70656e696e67001b04f0547279696e6720746f2066696c6c206f70656e696e67207769746820616e206170706c69636174696f6e20666f72206f74686572206f70656e696e6764576f726b657253746f7261676556616c7565546f6f4c6f6e67001c0480576f726b65722073746f72616765207465787420697320746f6f206c6f6e672e70496e73756666696369656e74546f6b656e73466f7246756e64696e67001d04f8496e73756666696369656e7420746f6b656e7320666f722066756e64696e6720286f6e206d656d62657220636f6e74726f6c6c6572206163636f756e7429445a65726f546f6b656e7346756e64696e67001e047c547279696e6720746f2066756e642077697468207a65726f20746f6b656e7378496e73756666696369656e7442616c616e6365466f725472616e73666572001f04b443616e6e6f742077697468647261773a20696e73756666696369656e74206275646765742062616c616e63652e048c44697363757373696f6e206d6f64756c6520707265646566696e6564206572726f7273e109102873705f72756e74696d651c67656e657269634c756e636865636b65645f65787472696e73696348556e636865636b656445787472696e736963101c4164647265737301001043616c6c011904245369676e617475726501e50914457874726101f10900040028000000e509082873705f72756e74696d65384d756c74695369676e617475726500010c1c45643235353139040091050148656432353531393a3a5369676e61747572650000001c537232353531390400c5050148737232353531393a3a5369676e61747572650001001445636473610400e909014065636473613a3a5369676e617475726500020000e9090c1c73705f636f7265146563647361245369676e617475726500000400ed0901205b75383b2036355d0000ed09000003410000000800f10900000420f509f909fd09010a050a0d0a110a150a00f50910306672616d655f73797374656d28657874656e73696f6e7354636865636b5f6e6f6e5f7a65726f5f73656e64657248436865636b4e6f6e5a65726f53656e64657204045400000000f90910306672616d655f73797374656d28657874656e73696f6e7348636865636b5f737065635f76657273696f6e40436865636b5370656356657273696f6e04045400000000fd0910306672616d655f73797374656d28657874656e73696f6e7340636865636b5f74785f76657273696f6e38436865636b547856657273696f6e04045400000000010a10306672616d655f73797374656d28657874656e73696f6e7334636865636b5f67656e6573697330436865636b47656e6573697304045400000000050a10306672616d655f73797374656d28657874656e73696f6e733c636865636b5f6d6f7274616c69747938436865636b4d6f7274616c69747904045400000400090a010c4572610000090a102873705f72756e74696d651c67656e657269630c6572610c4572610001010420496d6d6f7274616c0000001c4d6f7274616c31040008000001001c4d6f7274616c32040008000002001c4d6f7274616c33040008000003001c4d6f7274616c34040008000004001c4d6f7274616c35040008000005001c4d6f7274616c36040008000006001c4d6f7274616c37040008000007001c4d6f7274616c38040008000008001c4d6f7274616c3904000800000900204d6f7274616c313004000800000a00204d6f7274616c313104000800000b00204d6f7274616c313204000800000c00204d6f7274616c313304000800000d00204d6f7274616c313404000800000e00204d6f7274616c313504000800000f00204d6f7274616c313604000800001000204d6f7274616c313704000800001100204d6f7274616c313804000800001200204d6f7274616c313904000800001300204d6f7274616c323004000800001400204d6f7274616c323104000800001500204d6f7274616c323204000800001600204d6f7274616c323304000800001700204d6f7274616c323404000800001800204d6f7274616c323504000800001900204d6f7274616c323604000800001a00204d6f7274616c323704000800001b00204d6f7274616c323804000800001c00204d6f7274616c323904000800001d00204d6f7274616c333004000800001e00204d6f7274616c333104000800001f00204d6f7274616c333204000800002000204d6f7274616c333304000800002100204d6f7274616c333404000800002200204d6f7274616c333504000800002300204d6f7274616c333604000800002400204d6f7274616c333704000800002500204d6f7274616c333804000800002600204d6f7274616c333904000800002700204d6f7274616c343004000800002800204d6f7274616c343104000800002900204d6f7274616c343204000800002a00204d6f7274616c343304000800002b00204d6f7274616c343404000800002c00204d6f7274616c343504000800002d00204d6f7274616c343604000800002e00204d6f7274616c343704000800002f00204d6f7274616c343804000800003000204d6f7274616c343904000800003100204d6f7274616c353004000800003200204d6f7274616c353104000800003300204d6f7274616c353204000800003400204d6f7274616c353304000800003500204d6f7274616c353404000800003600204d6f7274616c353504000800003700204d6f7274616c353604000800003800204d6f7274616c353704000800003900204d6f7274616c353804000800003a00204d6f7274616c353904000800003b00204d6f7274616c363004000800003c00204d6f7274616c363104000800003d00204d6f7274616c363204000800003e00204d6f7274616c363304000800003f00204d6f7274616c363404000800004000204d6f7274616c363504000800004100204d6f7274616c363604000800004200204d6f7274616c363704000800004300204d6f7274616c363804000800004400204d6f7274616c363904000800004500204d6f7274616c373004000800004600204d6f7274616c373104000800004700204d6f7274616c373204000800004800204d6f7274616c373304000800004900204d6f7274616c373404000800004a00204d6f7274616c373504000800004b00204d6f7274616c373604000800004c00204d6f7274616c373704000800004d00204d6f7274616c373804000800004e00204d6f7274616c373904000800004f00204d6f7274616c383004000800005000204d6f7274616c383104000800005100204d6f7274616c383204000800005200204d6f7274616c383304000800005300204d6f7274616c383404000800005400204d6f7274616c383504000800005500204d6f7274616c383604000800005600204d6f7274616c383704000800005700204d6f7274616c383804000800005800204d6f7274616c383904000800005900204d6f7274616c393004000800005a00204d6f7274616c393104000800005b00204d6f7274616c393204000800005c00204d6f7274616c393304000800005d00204d6f7274616c393404000800005e00204d6f7274616c393504000800005f00204d6f7274616c393604000800006000204d6f7274616c393704000800006100204d6f7274616c393804000800006200204d6f7274616c393904000800006300244d6f7274616c31303004000800006400244d6f7274616c31303104000800006500244d6f7274616c31303204000800006600244d6f7274616c31303304000800006700244d6f7274616c31303404000800006800244d6f7274616c31303504000800006900244d6f7274616c31303604000800006a00244d6f7274616c31303704000800006b00244d6f7274616c31303804000800006c00244d6f7274616c31303904000800006d00244d6f7274616c31313004000800006e00244d6f7274616c31313104000800006f00244d6f7274616c31313204000800007000244d6f7274616c31313304000800007100244d6f7274616c31313404000800007200244d6f7274616c31313504000800007300244d6f7274616c31313604000800007400244d6f7274616c31313704000800007500244d6f7274616c31313804000800007600244d6f7274616c31313904000800007700244d6f7274616c31323004000800007800244d6f7274616c31323104000800007900244d6f7274616c31323204000800007a00244d6f7274616c31323304000800007b00244d6f7274616c31323404000800007c00244d6f7274616c31323504000800007d00244d6f7274616c31323604000800007e00244d6f7274616c31323704000800007f00244d6f7274616c31323804000800008000244d6f7274616c31323904000800008100244d6f7274616c31333004000800008200244d6f7274616c31333104000800008300244d6f7274616c31333204000800008400244d6f7274616c31333304000800008500244d6f7274616c31333404000800008600244d6f7274616c31333504000800008700244d6f7274616c31333604000800008800244d6f7274616c31333704000800008900244d6f7274616c31333804000800008a00244d6f7274616c31333904000800008b00244d6f7274616c31343004000800008c00244d6f7274616c31343104000800008d00244d6f7274616c31343204000800008e00244d6f7274616c31343304000800008f00244d6f7274616c31343404000800009000244d6f7274616c31343504000800009100244d6f7274616c31343604000800009200244d6f7274616c31343704000800009300244d6f7274616c31343804000800009400244d6f7274616c31343904000800009500244d6f7274616c31353004000800009600244d6f7274616c31353104000800009700244d6f7274616c31353204000800009800244d6f7274616c31353304000800009900244d6f7274616c31353404000800009a00244d6f7274616c31353504000800009b00244d6f7274616c31353604000800009c00244d6f7274616c31353704000800009d00244d6f7274616c31353804000800009e00244d6f7274616c31353904000800009f00244d6f7274616c3136300400080000a000244d6f7274616c3136310400080000a100244d6f7274616c3136320400080000a200244d6f7274616c3136330400080000a300244d6f7274616c3136340400080000a400244d6f7274616c3136350400080000a500244d6f7274616c3136360400080000a600244d6f7274616c3136370400080000a700244d6f7274616c3136380400080000a800244d6f7274616c3136390400080000a900244d6f7274616c3137300400080000aa00244d6f7274616c3137310400080000ab00244d6f7274616c3137320400080000ac00244d6f7274616c3137330400080000ad00244d6f7274616c3137340400080000ae00244d6f7274616c3137350400080000af00244d6f7274616c3137360400080000b000244d6f7274616c3137370400080000b100244d6f7274616c3137380400080000b200244d6f7274616c3137390400080000b300244d6f7274616c3138300400080000b400244d6f7274616c3138310400080000b500244d6f7274616c3138320400080000b600244d6f7274616c3138330400080000b700244d6f7274616c3138340400080000b800244d6f7274616c3138350400080000b900244d6f7274616c3138360400080000ba00244d6f7274616c3138370400080000bb00244d6f7274616c3138380400080000bc00244d6f7274616c3138390400080000bd00244d6f7274616c3139300400080000be00244d6f7274616c3139310400080000bf00244d6f7274616c3139320400080000c000244d6f7274616c3139330400080000c100244d6f7274616c3139340400080000c200244d6f7274616c3139350400080000c300244d6f7274616c3139360400080000c400244d6f7274616c3139370400080000c500244d6f7274616c3139380400080000c600244d6f7274616c3139390400080000c700244d6f7274616c3230300400080000c800244d6f7274616c3230310400080000c900244d6f7274616c3230320400080000ca00244d6f7274616c3230330400080000cb00244d6f7274616c3230340400080000cc00244d6f7274616c3230350400080000cd00244d6f7274616c3230360400080000ce00244d6f7274616c3230370400080000cf00244d6f7274616c3230380400080000d000244d6f7274616c3230390400080000d100244d6f7274616c3231300400080000d200244d6f7274616c3231310400080000d300244d6f7274616c3231320400080000d400244d6f7274616c3231330400080000d500244d6f7274616c3231340400080000d600244d6f7274616c3231350400080000d700244d6f7274616c3231360400080000d800244d6f7274616c3231370400080000d900244d6f7274616c3231380400080000da00244d6f7274616c3231390400080000db00244d6f7274616c3232300400080000dc00244d6f7274616c3232310400080000dd00244d6f7274616c3232320400080000de00244d6f7274616c3232330400080000df00244d6f7274616c3232340400080000e000244d6f7274616c3232350400080000e100244d6f7274616c3232360400080000e200244d6f7274616c3232370400080000e300244d6f7274616c3232380400080000e400244d6f7274616c3232390400080000e500244d6f7274616c3233300400080000e600244d6f7274616c3233310400080000e700244d6f7274616c3233320400080000e800244d6f7274616c3233330400080000e900244d6f7274616c3233340400080000ea00244d6f7274616c3233350400080000eb00244d6f7274616c3233360400080000ec00244d6f7274616c3233370400080000ed00244d6f7274616c3233380400080000ee00244d6f7274616c3233390400080000ef00244d6f7274616c3234300400080000f000244d6f7274616c3234310400080000f100244d6f7274616c3234320400080000f200244d6f7274616c3234330400080000f300244d6f7274616c3234340400080000f400244d6f7274616c3234350400080000f500244d6f7274616c3234360400080000f600244d6f7274616c3234370400080000f700244d6f7274616c3234380400080000f800244d6f7274616c3234390400080000f900244d6f7274616c3235300400080000fa00244d6f7274616c3235310400080000fb00244d6f7274616c3235320400080000fc00244d6f7274616c3235330400080000fd00244d6f7274616c3235340400080000fe00244d6f7274616c3235350400080000ff00000d0a10306672616d655f73797374656d28657874656e73696f6e732c636865636b5f6e6f6e636528436865636b4e6f6e636504045400000400c9030120543a3a496e6465780000110a10306672616d655f73797374656d28657874656e73696f6e7330636865636b5f7765696768742c436865636b57656967687404045400000000150a086870616c6c65745f7472616e73616374696f6e5f7061796d656e74604368617267655472616e73616374696f6e5061796d656e7404045400000400d0013042616c616e63654f663c543e0000190a08586a6f7973747265616d5f6e6f64655f72756e74696d651c52756e74696d6500000000a81853797374656d011853797374656d401c4163636f756e7401010402000c4101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e8205468652066756c6c206163636f756e7420696e666f726d6174696f6e20666f72206120706172746963756c6172206163636f756e742049442e3845787472696e736963436f756e74000010040004b820546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2c426c6f636b57656967687401001c600000000000000000000000000000000000000000000000000488205468652063757272656e742077656967687420666f722074686520626c6f636b2e40416c6c45787472696e736963734c656e000010040004410120546f74616c206c656e6774682028696e2062797465732920666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e24426c6f636b486173680101040510248000000000000000000000000000000000000000000000000000000000000000000498204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e3445787472696e736963446174610101040510280400043d012045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e184e756d6265720100101000000000040901205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e28506172656e744861736801002480000000000000000000000000000000000000000000000000000000000000000004702048617368206f66207468652070726576696f757320626c6f636b2e1844696765737401002c040004f020446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e184576656e747301003c04001ca0204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e001d01204e4f54453a20546865206974656d20697320756e626f756e6420616e642073686f756c64207468657265666f7265206e657665722062652072656164206f6e20636861696e2ed020497420636f756c64206f746865727769736520696e666c6174652074686520506f562073697a65206f66206120626c6f636b2e002d01204576656e747320686176652061206c6172676520696e2d6d656d6f72792073697a652e20426f7820746865206576656e747320746f206e6f7420676f206f75742d6f662d6d656d6f7279fc206a75737420696e206361736520736f6d656f6e65207374696c6c207265616473207468656d2066726f6d2077697468696e207468652072756e74696d652e284576656e74436f756e74010010100000000004b820546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e2c4576656e74546f706963730101040224bd030400282501204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e646578657394206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e00510120416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e2054686973450120616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e64e420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e004d01205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573744d012074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b0101206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e484c61737452756e74696d65557067726164650000c50304000455012053746f726573207468652060737065635f76657273696f6e6020616e642060737065635f6e616d6560206f66207768656e20746865206c6173742072756e74696d6520757067726164652068617070656e65642e545570677261646564546f553332526566436f756e740100880400044d012054727565206966207765206861766520757067726164656420736f207468617420607479706520526566436f756e74602069732060753332602e2046616c7365202864656661756c7429206966206e6f742e605570677261646564546f547269706c65526566436f756e740100880400085d012054727565206966207765206861766520757067726164656420736f2074686174204163636f756e74496e666f20636f6e7461696e73207468726565207479706573206f662060526566436f756e74602e2046616c736548202864656661756c7429206966206e6f742e38457865637574696f6e50686173650000b503040004882054686520657865637574696f6e207068617365206f662074686520626c6f636b2e01d10301481830426c6f636b57656967687473dd03850120f7d6600100000000204aa9d1010000a0035b06000000000160c4aea72e010000010098f73e5d010000010000000000000000a0035b060000000001604c0112a30100000100204aa9d1010000010088526a74000000a0035b060000000000000004d020426c6f636b20262065787472696e7369637320776569676874733a20626173652076616c75657320616e64206c696d6974732e2c426c6f636b4c656e677468e9033000003c00000050000000500004a820546865206d6178696d756d206c656e677468206f66206120626c6f636b2028696e206279746573292e38426c6f636b48617368436f756e74101060090000045501204d6178696d756d206e756d626572206f6620626c6f636b206e756d62657220746f20626c6f636b2068617368206d617070696e677320746f206b65657020286f6c64657374207072756e6564206669727374292e204462576569676874f103408848890000000000f0b64603000000000409012054686520776569676874206f662072756e74696d65206461746162617365206f7065726174696f6e73207468652072756e74696d652063616e20696e766f6b652e1c56657273696f6ef503d102386a6f7973747265616d2d6e6f6465386a6f7973747265616d2d6e6f64650c000000e8030000000000002cdf6acb689907609b0400000037e397fc7c91f5e40100000040fe3ad401f8959a06000000d2bc9897eed08f1503000000f78b278be53f454c02000000ed99c5acb25eedf503000000cbca25e39f14238702000000687ad44ad37f03c201000000bc9d89904f5b923f0100000037c8bb1350a9a2a801000000ab3c0572291feb8b0100000001000000010484204765742074686520636861696e27732063757272656e742076657273696f6e2e28535335385072656669780904087e0014a8205468652064657369676e61746564205353383520707265666978206f66207468697320636861696e2e0039012054686973207265706c6163657320746865202273733538466f726d6174222070726f7065727479206465636c6172656420696e2074686520636861696e20737065632e20526561736f6e20697331012074686174207468652072756e74696d652073686f756c64206b6e6f772061626f7574207468652070726566697820696e206f7264657220746f206d616b6520757365206f662069742061737020616e206964656e746966696572206f662074686520636861696e2e010d04001c5574696c69747900011104016c044c626174636865645f63616c6c735f6c696d69741010aa2a000004a820546865206c696d6974206f6e20746865206e756d626572206f6620626174636865642063616c6c732e019906011042616265011042616265402845706f6368496e64657801002020000000000000000004542043757272656e742065706f636820696e6465782e2c417574686f72697469657301009d060400046c2043757272656e742065706f636820617574686f7269746965732e2c47656e65736973536c6f740100310420000000000000000008f82054686520736c6f74206174207768696368207468652066697273742065706f63682061637475616c6c7920737461727465642e205468697320697320309020756e74696c2074686520666972737420626c6f636b206f662074686520636861696e2e2c43757272656e74536c6f740100310420000000000000000004542043757272656e7420736c6f74206e756d6265722e2852616e646f6d6e65737301000480000000000000000000000000000000000000000000000000000000000000000028b8205468652065706f63682072616e646f6d6e65737320666f7220746865202a63757272656e742a2065706f63682e002c20232053656375726974790005012054686973204d555354204e4f54206265207573656420666f722067616d626c696e672c2061732069742063616e20626520696e666c75656e6365642062792061f8206d616c6963696f75732076616c696461746f7220696e207468652073686f7274207465726d2e204974204d4159206265207573656420696e206d616e7915012063727970746f677261706869632070726f746f636f6c732c20686f77657665722c20736f206c6f6e67206173206f6e652072656d656d6265727320746861742074686973150120286c696b652065766572797468696e6720656c7365206f6e2d636861696e29206974206973207075626c69632e20466f72206578616d706c652c2069742063616e206265050120757365642077686572652061206e756d626572206973206e656564656420746861742063616e6e6f742068617665206265656e2063686f73656e20627920616e0d01206164766572736172792c20666f7220707572706f7365732073756368206173207075626c69632d636f696e207a65726f2d6b6e6f776c656467652070726f6f66732e6050656e64696e6745706f6368436f6e6669674368616e67650000390404000461012050656e64696e672065706f636820636f6e66696775726174696f6e206368616e676520746861742077696c6c206265206170706c696564207768656e20746865206e6578742065706f636820697320656e61637465642e384e65787452616e646f6d6e657373010004800000000000000000000000000000000000000000000000000000000000000000045c204e6578742065706f63682072616e646f6d6e6573732e3c4e657874417574686f72697469657301009d0604000460204e6578742065706f636820617574686f7269746965732e305365676d656e74496e6465780100101000000000247c2052616e646f6d6e65737320756e64657220636f6e737472756374696f6e2e00f8205765206d616b6520612074726164652d6f6666206265747765656e2073746f7261676520616363657373657320616e64206c697374206c656e6774682e01012057652073746f72652074686520756e6465722d636f6e737472756374696f6e2072616e646f6d6e65737320696e207365676d656e7473206f6620757020746f942060554e4445525f434f4e535452554354494f4e5f5345474d454e545f4c454e475448602e00ec204f6e63652061207365676d656e7420726561636865732074686973206c656e6774682c20776520626567696e20746865206e657874206f6e652e090120576520726573657420616c6c207365676d656e747320616e642072657475726e20746f206030602061742074686520626567696e6e696e67206f662065766572791c2065706f63682e44556e646572436f6e737472756374696f6e0101040510a90604000415012054574f582d4e4f54453a20605365676d656e74496e6465786020697320616e20696e6372656173696e6720696e74656765722c20736f2074686973206973206f6b61792e2c496e697469616c697a65640000b10604000801012054656d706f726172792076616c75652028636c656172656420617420626c6f636b2066696e616c697a6174696f6e292077686963682069732060536f6d65601d01206966207065722d626c6f636b20696e697469616c697a6174696f6e2068617320616c7265616479206265656e2063616c6c656420666f722063757272656e7420626c6f636b2e4c417574686f7256726652616e646f6d6e6573730100c50604001015012054686973206669656c642073686f756c6420616c7761797320626520706f70756c6174656420647572696e6720626c6f636b2070726f63657373696e6720756e6c6573731901207365636f6e6461727920706c61696e20736c6f74732061726520656e61626c65642028776869636820646f6e277420636f6e7461696e206120565246206f7574707574292e0049012049742069732073657420696e20606f6e5f66696e616c697a65602c206265666f72652069742077696c6c20636f6e7461696e207468652076616c75652066726f6d20746865206c61737420626c6f636b2e2845706f636853746172740100c103200000000000000000145d012054686520626c6f636b206e756d62657273207768656e20746865206c61737420616e642063757272656e742065706f6368206861766520737461727465642c20726573706563746976656c7920604e2d316020616e641420604e602e4901204e4f54453a20576520747261636b207468697320697320696e206f7264657220746f20616e6e6f746174652074686520626c6f636b206e756d626572207768656e206120676976656e20706f6f6c206f66590120656e74726f7079207761732066697865642028692e652e20697420776173206b6e6f776e20746f20636861696e206f6273657276657273292e2053696e63652065706f6368732061726520646566696e656420696e590120736c6f74732c207768696368206d617920626520736b69707065642c2074686520626c6f636b206e756d62657273206d6179206e6f74206c696e6520757020776974682074686520736c6f74206e756d626572732e204c6174656e657373010010100000000014d820486f77206c617465207468652063757272656e7420626c6f636b20697320636f6d706172656420746f2069747320706172656e742e001501205468697320656e74727920697320706f70756c617465642061732070617274206f6620626c6f636b20657865637574696f6e20616e6420697320636c65616e65642075701101206f6e20626c6f636b2066696e616c697a6174696f6e2e205175657279696e6720746869732073746f7261676520656e747279206f757473696465206f6620626c6f636bb020657865637574696f6e20636f6e746578742073686f756c6420616c77617973207969656c64207a65726f2e2c45706f6368436f6e6669670000c90604000861012054686520636f6e66696775726174696f6e20666f72207468652063757272656e742065706f63682e2053686f756c64206e6576657220626520604e6f6e656020617320697420697320696e697469616c697a656420696e242067656e657369732e3c4e65787445706f6368436f6e6669670000c9060400082d012054686520636f6e66696775726174696f6e20666f7220746865206e6578742065706f63682c20604e6f6e65602069662074686520636f6e6669672077696c6c206e6f74206368616e6765e82028796f752063616e2066616c6c6261636b20746f206045706f6368436f6e6669676020696e737465616420696e20746861742063617365292e011d04000c3445706f63684475726174696f6e202058020000000000000cec2054686520616d6f756e74206f662074696d652c20696e20736c6f74732c207468617420656163682065706f63682073686f756c64206c6173742e1901204e4f54453a2043757272656e746c79206974206973206e6f7420706f737369626c6520746f206368616e6765207468652065706f6368206475726174696f6e20616674657221012074686520636861696e2068617320737461727465642e20417474656d7074696e6720746f20646f20736f2077696c6c20627269636b20626c6f636b2070726f64756374696f6e2e444578706563746564426c6f636b54696d652020701700000000000014050120546865206578706563746564206176657261676520626c6f636b2074696d6520617420776869636820424142452073686f756c64206265206372656174696e67110120626c6f636b732e2053696e636520424142452069732070726f626162696c6973746963206974206973206e6f74207472697669616c20746f20666967757265206f75740501207768617420746865206578706563746564206176657261676520626c6f636b2074696d652073686f756c64206265206261736564206f6e2074686520736c6f740901206475726174696f6e20616e642074686520736563757269747920706172616d657465722060636020287768657265206031202d20636020726570726573656e7473a0207468652070726f626162696c697479206f66206120736c6f74206265696e6720656d707479292e384d6178417574686f7269746965731010a08601000488204d6178206e756d626572206f6620617574686f72697469657320616c6c6f77656401cd06022454696d657374616d70012454696d657374616d70080c4e6f7701002020000000000000000004902043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e24446964557064617465010088040004b420446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f0141040004344d696e696d756d506572696f642020b80b000000000000104d0120546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a5d0120706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c5d012067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c206265a020646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e000328417574686f72736869700128417574686f72736869700c18556e636c65730100d1060400041c20556e636c657318417574686f720000000400046420417574686f72206f662063757272656e7420626c6f636b2e30446964536574556e636c6573010088040004bc205768657468657220756e636c6573207765726520616c72656164792073657420696e207468697320626c6f636b2e014904000440556e636c6547656e65726174696f6e731010000000000ccc20546865206e756d626572206f6620626c6f636b73206261636b2077652073686f756c642061636365707420756e636c65732ee42054686973206d65616e7320746861742077652077696c6c206465616c207769746820756e636c652d706172656e7473207468617420617265942060556e636c6547656e65726174696f6e73202b203160206265666f726520606e6f77602e01d906042042616c616e636573012042616c616e6365731434546f74616c49737375616e6365010018400000000000000000000000000000000004982054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e1c4163636f756e74010104020014010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600901205468652042616c616e6365732070616c6c6574206578616d706c65206f662073746f72696e67207468652062616c616e6365206f6620616e206163636f756e742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b19022020202074797065204163636f756e7453746f7265203d2053746f726167654d61705368696d3c53656c663a3a4163636f756e743c52756e74696d653e2c206672616d655f73797374656d3a3a50726f76696465723c52756e74696d653e2c204163636f756e7449642c2053656c663a3a4163636f756e74446174613c42616c616e63653e3e0c20207d102060606000150120596f752063616e20616c736f2073746f7265207468652062616c616e6365206f6620616e206163636f756e7420696e20746865206053797374656d602070616c6c65742e00282023204578616d706c650034206060606e6f636f6d70696c65b02020696d706c2070616c6c65745f62616c616e6365733a3a436f6e66696720666f722052756e74696d65207b7420202074797065204163636f756e7453746f7265203d2053797374656d0c20207d102060606000510120427574207468697320636f6d657320776974682074726164656f6666732c2073746f72696e67206163636f756e742062616c616e63657320696e207468652073797374656d2070616c6c65742073746f7265736d0120606672616d655f73797374656d60206461746120616c6f6e677369646520746865206163636f756e74206461746120636f6e747261727920746f2073746f72696e67206163636f756e742062616c616e63657320696e207468652901206042616c616e636573602070616c6c65742c20776869636820757365732061206053746f726167654d61706020746f2073746f72652062616c616e6365732064617461206f6e6c792e4101204e4f54453a2054686973206973206f6e6c79207573656420696e207468652063617365207468617420746869732070616c6c6574206973207573656420746f2073746f72652062616c616e6365732e144c6f636b730101040200dd06040008b820416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2501204e4f54453a2053686f756c64206f6e6c79206265206163636573736564207768656e2073657474696e672c206368616e67696e6720616e642066726565696e672061206c6f636b2e2052657365727665730101040200ed06040004a4204e616d6564207265736572766573206f6e20736f6d65206163636f756e742062616c616e6365732e3853746f7261676556657273696f6e0100f90604000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076322e302e3020666f72206e6577206e6574776f726b732e01510401780c484578697374656e7469616c4465706f73697418404002e50f00000000000000000000000004d420546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e204d61784c6f636b7310103200000008f420546865206d6178696d756d206e756d626572206f66206c6f636b7320746861742073686f756c64206578697374206f6e20616e206163636f756e742edc204e6f74207374726963746c7920656e666f726365642c20627574207573656420666f722077656967687420657374696d6174696f6e2e2c4d61785265736572766573101032000000040d0120546865206d6178696d756d206e756d626572206f66206e616d656420726573657276657320746861742063616e206578697374206f6e20616e206163636f756e742e01fd0605485472616e73616374696f6e5061796d656e7401485472616e73616374696f6e5061796d656e7408444e6578744665654d756c7469706c6965720100010740000064a7b3b6e00d0000000000000000003853746f7261676556657273696f6e01000507040000000004604f7065726174696f6e616c4665654d756c7469706c696572080405545901204120666565206d756c6974706c69657220666f7220604f7065726174696f6e616c602065787472696e7369637320746f20636f6d7075746520227669727475616c207469702220746f20626f6f73742074686569722c20607072696f7269747960004d0120546869732076616c7565206973206d756c7469706c656420627920746865206066696e616c5f6665656020746f206f627461696e206120227669727475616c20746970222074686174206973206c61746572f420616464656420746f20612074697020636f6d706f6e656e7420696e20726567756c617220607072696f72697479602063616c63756c6174696f6e732e4d01204974206d65616e732074686174206120604e6f726d616c60207472616e73616374696f6e2063616e2066726f6e742d72756e20612073696d696c61726c792d73697a656420604f7065726174696f6e616c6041012065787472696e736963202877697468206e6f20746970292c20627920696e636c7564696e672061207469702076616c75652067726561746572207468616e20746865207669727475616c207469702e003c20606060727573742c69676e6f726540202f2f20466f7220604e6f726d616c608c206c6574207072696f72697479203d207072696f726974795f63616c6328746970293b0054202f2f20466f7220604f7065726174696f6e616c601101206c6574207669727475616c5f746970203d2028696e636c7573696f6e5f666565202b2074697029202a204f7065726174696f6e616c4665654d756c7469706c6965723bc4206c6574207072696f72697479203d207072696f726974795f63616c6328746970202b207669727475616c5f746970293b1020606060005101204e6f746520746861742073696e636520776520757365206066696e616c5f6665656020746865206d756c7469706c696572206170706c69657320616c736f20746f2074686520726567756c61722060746970605d012073656e74207769746820746865207472616e73616374696f6e2e20536f2c206e6f74206f6e6c7920646f657320746865207472616e73616374696f6e206765742061207072696f726974792062756d702062617365646101206f6e207468652060696e636c7573696f6e5f666565602c2062757420776520616c736f20616d706c6966792074686520696d70616374206f662074697073206170706c69656420746f20604f7065726174696f6e616c6038207472616e73616374696f6e732e000668456c656374696f6e50726f76696465724d756c746950686173650168456c656374696f6e50726f76696465724d756c746950686173652814526f756e64010010100100000018ac20496e7465726e616c20636f756e74657220666f7220746865206e756d626572206f6620726f756e64732e00550120546869732069732075736566756c20666f722064652d6475706c69636174696f6e206f66207472616e73616374696f6e73207375626d697474656420746f2074686520706f6f6c2c20616e642067656e6572616c6c20646961676e6f7374696373206f66207468652070616c6c65742e004d012054686973206973206d6572656c7920696e6372656d656e746564206f6e6365207065722065766572792074696d65207468617420616e20757073747265616d2060656c656374602069732063616c6c65642e3043757272656e745068617365010009070400043c2043757272656e742070686173652e38517565756564536f6c7574696f6e000011070400043d012043757272656e74206265737420736f6c7574696f6e2c207369676e6564206f7220756e7369676e65642c2071756575656420746f2062652072657475726e65642075706f6e2060656c656374602e20536e617073686f740000150704000c7020536e617073686f742064617461206f662074686520726f756e642e005d01205468697320697320637265617465642061742074686520626567696e6e696e67206f6620746865207369676e656420706861736520616e6420636c65617265642075706f6e2063616c6c696e672060656c656374602e38446573697265645461726765747300001004000ccc2044657369726564206e756d626572206f66207461726765747320746f20656c65637420666f72207468697320726f756e642e00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e40536e617073686f744d6574616461746100002d0504000c9820546865206d65746164617461206f6620746865205b60526f756e64536e617073686f74605d00a8204f6e6c7920657869737473207768656e205b60536e617073686f74605d2069732070726573656e742e645369676e65645375626d697373696f6e4e657874496e646578010010100000000024010120546865206e65787420696e64657820746f2062652061737369676e656420746f20616e20696e636f6d696e67207369676e6564207375626d697373696f6e2e007501204576657279206163636570746564207375626d697373696f6e2069732061737369676e6564206120756e6971756520696e6465783b207468617420696e64657820697320626f756e6420746f207468617420706172746963756c61726501207375626d697373696f6e20666f7220746865206475726174696f6e206f662074686520656c656374696f6e2e204f6e20656c656374696f6e2066696e616c697a6174696f6e2c20746865206e65787420696e6465782069733020726573657420746f20302e0069012057652063616e2774206a7573742075736520605369676e65645375626d697373696f6e496e64696365732e6c656e2829602c206265636175736520746861742773206120626f756e646564207365743b20706173742069747359012063617061636974792c2069742077696c6c2073696d706c792073617475726174652e2057652063616e2774206a7573742069746572617465206f76657220605369676e65645375626d697373696f6e734d6170602cf4206265636175736520697465726174696f6e20697320736c6f772e20496e73746561642c2077652073746f7265207468652076616c756520686572652e5c5369676e65645375626d697373696f6e496e6469636573010025070400184d01204120736f727465642c20626f756e64656420736574206f6620602873636f72652c20696e64657829602c20776865726520656163682060696e6465786020706f696e747320746f20612076616c756520696e5420605369676e65645375626d697373696f6e73602e007101205765206e65766572206e65656420746f2070726f63657373206d6f7265207468616e20612073696e676c65207369676e6564207375626d697373696f6e20617420612074696d652e205369676e6564207375626d697373696f6e7375012063616e206265207175697465206c617267652c20736f2077652772652077696c6c696e6720746f207061792074686520636f7374206f66206d756c7469706c6520646174616261736520616363657373657320746f206163636573732101207468656d206f6e6520617420612074696d6520696e7374656164206f662072656164696e6720616e64206465636f64696e6720616c6c206f66207468656d206174206f6e63652e505369676e65645375626d697373696f6e734d61700001040510350704001c7420556e636865636b65642c207369676e656420736f6c7574696f6e732e00690120546f676574686572207769746820605375626d697373696f6e496e6469636573602c20746869732073746f726573206120626f756e64656420736574206f6620605369676e65645375626d697373696f6e7360207768696c65ec20616c6c6f77696e6720757320746f206b656570206f6e6c7920612073696e676c65206f6e6520696e206d656d6f727920617420612074696d652e0069012054776f78206e6f74653a20746865206b6579206f6620746865206d617020697320616e206175746f2d696e6372656d656e74696e6720696e6465782077686963682075736572732063616e6e6f7420696e7370656374206f72f4206166666563743b2077652073686f756c646e2774206e65656420612063727970746f67726170686963616c6c7920736563757265206861736865722e544d696e696d756d556e7472757374656453636f7265000029050400105d0120546865206d696e696d756d2073636f7265207468617420656163682027756e747275737465642720736f6c7574696f6e206d7573742061747461696e20696e206f7264657220746f20626520636f6e7369646572656428206665617369626c652e00b82043616e206265207365742076696120607365745f6d696e696d756d5f756e747275737465645f73636f7265602e01550401803c34556e7369676e656450686173651010960000000480204475726174696f6e206f662074686520756e7369676e65642070686173652e2c5369676e656450686173651010960000000478204475726174696f6e206f6620746865207369676e65642070686173652e544265747465725369676e65645468726573686f6c649c1000000000084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061737820226265747465722220696e20746865205369676e65642070686173652e5c426574746572556e7369676e65645468726573686f6c649c1020a10700084d0120546865206d696e696d756d20616d6f756e74206f6620696d70726f76656d656e7420746f2074686520736f6c7574696f6e2073636f7265207468617420646566696e6573206120736f6c7574696f6e2061738020226265747465722220696e2074686520556e7369676e65642070686173652e384f6666636861696e52657065617410101200000010b42054686520726570656174207468726573686f6c64206f6620746865206f6666636861696e20776f726b65722e00610120466f72206578616d706c652c20696620697420697320352c2074686174206d65616e732074686174206174206c65617374203520626c6f636b732077696c6c20656c61707365206265747765656e20617474656d7074738420746f207375626d69742074686520776f726b6572277320736f6c7574696f6e2e3c4d696e657254785072696f726974792020feffffffffffff7f04250120546865207072696f72697479206f662074686520756e7369676e6564207472616e73616374696f6e207375626d697474656420696e2074686520756e7369676e65642d7068617365505369676e65644d61785375626d697373696f6e731010100000001ce4204d6178696d756d206e756d626572206f66207369676e6564207375626d697373696f6e7320746861742063616e206265207175657565642e005501204974206973206265737420746f2061766f69642061646a757374696e67207468697320647572696e6720616e20656c656374696f6e2c20617320697420696d706163747320646f776e73747265616d2064617461650120737472756374757265732e20496e20706172746963756c61722c20605369676e65645375626d697373696f6e496e64696365733c543e6020697320626f756e646564206f6e20746869732076616c75652e20496620796f75f42075706461746520746869732076616c756520647572696e6720616e20656c656374696f6e2c20796f75205f6d7573745f20656e7375726520746861744d0120605369676e65645375626d697373696f6e496e64696365732e6c656e282960206973206c657373207468616e206f7220657175616c20746f20746865206e65772076616c75652e204f74686572776973652cf020617474656d70747320746f207375626d6974206e657720736f6c7574696f6e73206d617920636175736520612072756e74696d652070616e69632e3c5369676e65644d6178576569676874202040cdd7462d0100001494204d6178696d756d20776569676874206f662061207369676e656420736f6c7574696f6e2e005d01204966205b60436f6e6669673a3a4d696e6572436f6e666967605d206973206265696e6720696d706c656d656e74656420746f207375626d6974207369676e656420736f6c7574696f6e7320286f757473696465206f663d0120746869732070616c6c6574292c207468656e205b604d696e6572436f6e6669673a3a736f6c7574696f6e5f776569676874605d206973207573656420746f20636f6d7061726520616761696e73743020746869732076616c75652e405369676e65644d6178526566756e647310100400000004190120546865206d6178696d756d20616d6f756e74206f6620756e636865636b656420736f6c7574696f6e7320746f20726566756e64207468652063616c6c2066656520666f722e405369676e6564526577617264426173651840aa821bce260000000000000000000000048820426173652072657761726420666f722061207369676e656420736f6c7574696f6e445369676e65644465706f736974426173651840a41a130d84010000000000000000000004902042617365206465706f73697420666f722061207369676e656420736f6c7574696f6e2e445369676e65644465706f7369744279746518406a6e190000000000000000000000000004a0205065722d62797465206465706f73697420666f722061207369676e656420736f6c7574696f6e2e4c5369676e65644465706f73697457656967687418400000000000000000000000000000000004a8205065722d776569676874206465706f73697420666f722061207369676e656420736f6c7574696f6e2e444d6178456c656374696e67566f746572731010d43000000c5d0120546865206d6178696d756d206e756d626572206f6620656c656374696e6720766f7465727320746f2070757420696e2074686520736e617073686f742e20417420746865206d6f6d656e742c20736e617073686f7473590120617265206f6e6c79206f76657220612073696e676c6520626c6f636b2c20627574206f6e6365206d756c74692d626c6f636b20656c656374696f6e732061726520696e74726f647563656420746865792077696c6c842074616b6520706c616365206f766572206d756c7469706c6520626c6f636b732e4c4d6178456c65637461626c6554617267657473090408ffff04010120546865206d6178696d756d206e756d626572206f6620656c65637461626c65207461726765747320746f2070757420696e2074686520736e617073686f742e013907071c5374616b696e67011c5374616b696e679c30486973746f7279446570746801001010540000001c8c204e756d626572206f66206572617320746f206b65657020696e20686973746f72792e00390120496e666f726d6174696f6e206973206b65707420666f72206572617320696e20605b63757272656e745f657261202d20686973746f72795f64657074683b2063757272656e745f6572615d602e006101204d757374206265206d6f7265207468616e20746865206e756d626572206f6620657261732064656c617965642062792073657373696f6e206f74686572776973652e20492e652e2061637469766520657261206d757374390120616c7761797320626520696e20686973746f72792e20492e652e20606163746976655f657261203e2063757272656e745f657261202d20686973746f72795f646570746860206d757374206265302067756172616e746565642e3856616c696461746f72436f756e74010010100000000004a82054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e544d696e696d756d56616c696461746f72436f756e740100101000000000044101204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e34496e76756c6e657261626c65730100510504000c590120416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e636520746865792772654d01206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f7572ac20696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e18426f6e6465640001040500000400040101204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e404d696e4e6f6d696e61746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f662061206e6f6d696e61746f722e404d696e56616c696461746f72426f6e64010018400000000000000000000000000000000004210120546865206d696e696d756d2061637469766520626f6e6420746f206265636f6d6520616e64206d61696e7461696e2074686520726f6c65206f6620612076616c696461746f722e344d696e436f6d6d697373696f6e01009c10000000000ce820546865206d696e696d756d20616d6f756e74206f6620636f6d6d697373696f6e20746861742076616c696461746f72732063616e207365742e00802049662073657420746f206030602c206e6f206c696d6974206578697374732e184c656467657200010402003d070400044501204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e14506179656501010405004d05040004e42057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e2856616c696461746f727301010405009408000004450120546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e50436f756e746572466f7256616c696461746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d617856616c696461746f7273436f756e7400001004000c310120546865206d6178696d756d2076616c696461746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e284e6f6d696e61746f727300010405004d07040040750120546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f207468656972206e6f6d696e6174696f6e20707265666572656e6365732c206e616d656c79207468652076616c696461746f72732074686174582074686579207769736820746f20737570706f72742e003901204e6f7465207468617420746865206b657973206f6620746869732073746f72616765206d6170206d69676874206265636f6d65206e6f6e2d6465636f6461626c6520696e2063617365207468656d01205b60436f6e6669673a3a4d61784e6f6d696e6174696f6e73605d20636f6e66696775726174696f6e206973206465637265617365642e20496e2074686973207261726520636173652c207468657365206e6f6d696e61746f7273650120617265207374696c6c206578697374656e7420696e2073746f726167652c207468656972206b657920697320636f727265637420616e64207265747269657661626c652028692e652e2060636f6e7461696e735f6b657960710120696e6469636174657320746861742074686579206578697374292c206275742074686569722076616c75652063616e6e6f74206265206465636f6465642e205468657265666f72652c20746865206e6f6e2d6465636f6461626c656d01206e6f6d696e61746f72732077696c6c206566666563746976656c79206e6f742d65786973742c20756e74696c20746865792072652d7375626d697420746865697220707265666572656e6365732073756368207468617420697401012069732077697468696e2074686520626f756e6473206f6620746865206e65776c79207365742060436f6e6669673a3a4d61784e6f6d696e6174696f6e73602e006101205468697320696d706c696573207468617420603a3a697465725f6b65797328292e636f756e7428296020616e6420603a3a6974657228292e636f756e74282960206d696768742072657475726e20646966666572656e746d012076616c75657320666f722074686973206d61702e204d6f72656f7665722c20746865206d61696e20603a3a636f756e7428296020697320616c69676e656420776974682074686520666f726d65722c206e616d656c79207468656c206e756d626572206f66206b65797320746861742065786973742e006d01204c6173746c792c20696620616e79206f6620746865206e6f6d696e61746f7273206265636f6d65206e6f6e2d6465636f6461626c652c20746865792063616e206265206368696c6c656420696d6d6564696174656c7920766961b8205b6043616c6c3a3a6368696c6c5f6f74686572605d20646973706174636861626c6520627920616e796f6e652e50436f756e746572466f724e6f6d696e61746f7273010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170484d61784e6f6d696e61746f7273436f756e7400001004000c310120546865206d6178696d756d206e6f6d696e61746f7220636f756e74206265666f72652077652073746f7020616c6c6f77696e67206e65772076616c696461746f727320746f206a6f696e2e00d0205768656e20746869732076616c7565206973206e6f74207365742c206e6f206c696d6974732061726520656e666f726365642e2843757272656e744572610000100400105c205468652063757272656e742065726120696e6465782e006501205468697320697320746865206c617465737420706c616e6e6564206572612c20646570656e64696e67206f6e20686f77207468652053657373696f6e2070616c6c657420717565756573207468652076616c696461746f7280207365742c206974206d6967687420626520616374697665206f72206e6f742e2441637469766545726100005107040010d820546865206163746976652065726120696e666f726d6174696f6e2c20697420686f6c647320696e64657820616e642073746172742e0059012054686520616374697665206572612069732074686520657261206265696e672063757272656e746c792072657761726465642e2056616c696461746f7220736574206f66207468697320657261206d757374206265ac20657175616c20746f205b6053657373696f6e496e746572666163653a3a76616c696461746f7273605d2e5445726173537461727453657373696f6e496e6465780001040510100400103101205468652073657373696f6e20696e646578206174207768696368207468652065726120737461727420666f7220746865206c6173742060484953544f52595f44455054486020657261732e006101204e6f74653a205468697320747261636b7320746865207374617274696e672073657373696f6e2028692e652e2073657373696f6e20696e646578207768656e20657261207374617274206265696e672061637469766529f020666f7220746865206572617320696e20605b43757272656e74457261202d20484953544f52595f44455054482c2043757272656e744572615d602e2c457261735374616b65727301010805055507cc0c0000001878204578706f73757265206f662076616c696461746f72206174206572612e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e48457261735374616b657273436c697070656401010805055507cc0c0000002c9820436c6970706564204578706f73757265206f662076616c696461746f72206174206572612e00590120546869732069732073696d696c617220746f205b60457261735374616b657273605d20627574206e756d626572206f66206e6f6d696e61746f7273206578706f736564206973207265647563656420746f20746865dc2060543a3a4d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732e1d0120284e6f74653a20746865206669656c642060746f74616c6020616e6420606f776e60206f6620746865206578706f737572652072656d61696e7320756e6368616e676564292ef42054686973206973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e005d012054686973206973206b657965642066697374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4101204966207374616b657273206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e20656d707479206578706f737572652069732072657475726e65642e484572617356616c696461746f72507265667301010805055507940800001411012053696d696c617220746f2060457261735374616b657273602c207468697320686f6c64732074686520707265666572656e636573206f662076616c696461746f72732e0061012054686973206973206b65796564206669727374206279207468652065726120696e64657820746f20616c6c6f772062756c6b2064656c6574696f6e20616e64207468656e20746865207374617368206163636f756e742e00a82049732069742072656d6f7665642061667465722060484953544f52595f44455054486020657261732e4c4572617356616c696461746f7252657761726400010405101804000c09012054686520746f74616c2076616c696461746f7220657261207061796f757420666f7220746865206c6173742060484953544f52595f44455054486020657261732e0021012045726173207468617420686176656e27742066696e697368656420796574206f7220686173206265656e2072656d6f76656420646f65736e27742068617665207265776172642e4045726173526577617264506f696e74730101040510590714000000000008ac205265776172647320666f7220746865206c6173742060484953544f52595f44455054486020657261732e250120496620726577617264206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207265776172642069732072657475726e65642e3845726173546f74616c5374616b65010104051018400000000000000000000000000000000008ec2054686520746f74616c20616d6f756e74207374616b656420666f7220746865206c6173742060484953544f52595f44455054486020657261732e1d0120496620746f74616c206861736e2774206265656e20736574206f7220686173206265656e2072656d6f766564207468656e2030207374616b652069732072657475726e65642e20466f7263654572610100690704000454204d6f6465206f662065726120666f7263696e672e4c536c6173685265776172644672616374696f6e01009c10000000000cf8205468652070657263656e74616765206f662074686520736c617368207468617420697320646973747269627574656420746f207265706f72746572732e00e4205468652072657374206f662074686520736c61736865642076616c75652069732068616e646c6564206279207468652060536c617368602e4c43616e63656c6564536c6173685061796f757401001840000000000000000000000000000000000815012054686520616d6f756e74206f662063757272656e637920676976656e20746f207265706f7274657273206f66206120736c617368206576656e7420776869636820776173ec2063616e63656c65642062792065787472616f7264696e6172792063697263756d7374616e6365732028652e672e20676f7665726e616e6365292e40556e6170706c696564536c617368657301010405106d07040004c420416c6c20756e6170706c69656420736c61736865732074686174206172652071756575656420666f72206c617465722e28426f6e646564457261730100bd0304001025012041206d617070696e672066726f6d207374696c6c2d626f6e646564206572617320746f207468652066697273742073657373696f6e20696e646578206f662074686174206572612e00c8204d75737420636f6e7461696e7320696e666f726d6174696f6e20666f72206572617320666f72207468652072616e67653abc20605b6163746976655f657261202d20626f756e64696e675f6475726174696f6e3b206163746976655f6572615d604c56616c696461746f72536c617368496e457261000108050555077507040008450120416c6c20736c617368696e67206576656e7473206f6e2076616c696461746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682070726f706f7274696f6e7020616e6420736c6173682076616c7565206f6620746865206572612e4c4e6f6d696e61746f72536c617368496e4572610001080505550718040004610120416c6c20736c617368696e67206576656e7473206f6e206e6f6d696e61746f72732c206d61707065642062792065726120746f20746865206869676865737420736c6173682076616c7565206f6620746865206572612e34536c617368696e675370616e73000104050079070400048c20536c617368696e67207370616e7320666f72207374617368206163636f756e74732e245370616e536c6173680101040565077d07800000000000000000000000000000000000000000000000000000000000000000083d01205265636f72647320696e666f726d6174696f6e2061626f757420746865206d6178696d756d20736c617368206f6620612073746173682077697468696e206120736c617368696e67207370616e2cb82061732077656c6c20617320686f77206d7563682072657761726420686173206265656e2070616964206f75742e584561726c69657374556e6170706c696564536c617368000010040004fc20546865206561726c696573742065726120666f72207768696368207765206861766520612070656e64696e672c20756e6170706c69656420736c6173682e5443757272656e74506c616e6e656453657373696f6e01001010000000000ce820546865206c61737420706c616e6e65642073657373696f6e207363686564756c6564206279207468652073657373696f6e2070616c6c65742e0071012054686973206973206261736963616c6c7920696e2073796e632077697468207468652063616c6c20746f205b6070616c6c65745f73657373696f6e3a3a53657373696f6e4d616e616765723a3a6e65775f73657373696f6e605d2e4c4f6666656e64696e6756616c696461746f727301008107040024690120496e6469636573206f662076616c696461746f727320746861742068617665206f6666656e64656420696e20746865206163746976652065726120616e6420776865746865722074686579206172652063757272656e746c79282064697361626c65642e00690120546869732076616c75652073686f756c642062652061207375706572736574206f662064697361626c65642076616c696461746f72732073696e6365206e6f7420616c6c206f6666656e636573206c65616420746f2074686571012076616c696461746f72206265696e672064697361626c65642028696620746865726520776173206e6f20736c617368292e2054686973206973206e656564656420746f20747261636b207468652070657263656e74616765206f6649012076616c696461746f727320746861742068617665206f6666656e64656420696e207468652063757272656e74206572612c20656e737572696e672061206e65772065726120697320666f72636564206966750120604f6666656e64696e6756616c696461746f72735468726573686f6c646020697320726561636865642e205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e6471012077686574686572206120676976656e2076616c696461746f72206861732070726576696f75736c79206f6666656e646564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e38207468652065726120656e64732e3853746f7261676556657273696f6e01008907040710cc2054727565206966206e6574776f726b20686173206265656e20757067726164656420746f20746869732076657273696f6e2e7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e00a020546869732069732073657420746f2076372e302e3020666f72206e6577206e6574776f726b732e384368696c6c5468726573686f6c640000550504000c510120546865207468726573686f6c6420666f72207768656e2075736572732063616e2073746172742063616c6c696e6720606368696c6c5f6f746865726020666f72206f746865722076616c696461746f7273202f5901206e6f6d696e61746f72732e20546865207468726573686f6c6420697320636f6d706172656420746f207468652061637475616c206e756d626572206f662076616c696461746f7273202f206e6f6d696e61746f72732901202860436f756e74466f722a602920696e207468652073797374656d20636f6d706172656420746f2074686520636f6e66696775726564206d61782028604d61782a436f756e7460292e014905019018384d61784e6f6d696e6174696f6e7310101000000004b4204d6178696d756d206e756d626572206f66206e6f6d696e6174696f6e7320706572206e6f6d696e61746f722e3853657373696f6e735065724572611010060000000470204e756d626572206f662073657373696f6e7320706572206572612e3c426f6e64696e674475726174696f6e10107000000004e4204e756d626572206f6620657261732074686174207374616b65642066756e6473206d7573742072656d61696e20626f6e64656420666f722e48536c61736844656665724475726174696f6e10106f000000100101204e756d626572206f662065726173207468617420736c6173686573206172652064656665727265642062792c20616674657220636f6d7075746174696f6e2e000d0120546869732073686f756c64206265206c657373207468616e2074686520626f6e64696e67206475726174696f6e2e2053657420746f203020696620736c617368657315012073686f756c64206265206170706c69656420696d6d6564696174656c792c20776974686f7574206f70706f7274756e69747920666f7220696e74657276656e74696f6e2e804d61784e6f6d696e61746f72526577617264656450657256616c696461746f7210100001000010f820546865206d6178696d756d206e756d626572206f66206e6f6d696e61746f727320726577617264656420666f7220656163682076616c696461746f722e00510120466f7220656163682076616c696461746f72206f6e6c79207468652060244d61784e6f6d696e61746f72526577617264656450657256616c696461746f72602062696767657374207374616b6572732063616e390120636c61696d207468656972207265776172642e2054686973207573656420746f206c696d69742074686520692f6f20636f737420666f7220746865206e6f6d696e61746f72207061796f75742e484d6178556e6c6f636b696e674368756e6b73101020000000084d0120546865206d6178696d756d206e756d626572206f662060756e6c6f636b696e6760206368756e6b732061205b605374616b696e674c6564676572605d2063616e20686176652e204566666563746976656c79f82064657465726d696e657320686f77206d616e7920756e6971756520657261732061207374616b6572206d617920626520756e626f6e64696e6720696e2e018d07081c53657373696f6e011c53657373696f6e1c2856616c696461746f7273010051050400047c205468652063757272656e7420736574206f662076616c696461746f72732e3043757272656e74496e646578010010100000000004782043757272656e7420696e646578206f66207468652073657373696f6e2e345175657565644368616e676564010088040008390120547275652069662074686520756e6465726c79696e672065636f6e6f6d6963206964656e746974696573206f7220776569676874696e6720626568696e64207468652076616c696461746f7273a420686173206368616e67656420696e20746865207175657565642076616c696461746f72207365742e285175657565644b657973010091070400083d012054686520717565756564206b65797320666f7220746865206e6578742073657373696f6e2e205768656e20746865206e6578742073657373696f6e20626567696e732c207468657365206b657973e02077696c6c206265207573656420746f2064657465726d696e65207468652076616c696461746f7227732073657373696f6e206b6579732e4844697361626c656456616c696461746f7273010059050400148020496e6469636573206f662064697361626c65642076616c696461746f72732e003d01205468652076656320697320616c77617973206b65707420736f7274656420736f20746861742077652063616e2066696e642077686574686572206120676976656e2076616c696461746f722069733d012064697361626c6564207573696e672062696e617279207365617263682e204974206765747320636c6561726564207768656e20606f6e5f73657373696f6e5f656e64696e67602072657475726e73642061206e657720736574206f66206964656e7469746965732e204e6578744b657973000104050071050400049c20546865206e6578742073657373696f6e206b65797320666f7220612076616c696461746f722e204b65794f776e657200010405990700040004090120546865206f776e6572206f662061206b65792e20546865206b65792069732074686520604b657954797065496460202b2074686520656e636f646564206b65792e016d0501a00001a1070928486973746f726963616c0128486973746f726963616c0848486973746f726963616c53657373696f6e730001040510a5070400045d01204d617070696e672066726f6d20686973746f726963616c2073657373696f6e20696e646963657320746f2073657373696f6e2d6461746120726f6f74206861736820616e642076616c696461746f7220636f756e742e2c53746f72656452616e67650000c103040004e4205468652072616e6765206f6620686973746f726963616c2073657373696f6e732077652073746f72652e205b66697273742c206c61737429000000000a1c4772616e647061011c4772616e647061181453746174650100a90704000490205374617465206f66207468652063757272656e7420617574686f72697479207365742e3450656e64696e674368616e67650000ad07040004c42050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e284e657874466f72636564000010040004bc206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e1c5374616c6c65640000c1030400049020607472756560206966207765206172652063757272656e746c79207374616c6c65642e3043757272656e745365744964010020200000000000000000085d0120546865206e756d626572206f66206368616e6765732028626f746820696e207465726d73206f66206b65797320616e6420756e6465726c79696e672065636f6e6f6d696320726573706f6e736962696c697469657329c420696e20746865202273657422206f66204772616e6470612076616c696461746f72732066726f6d2067656e657369732e30536574496453657373696f6e00010405201004001059012041206d617070696e672066726f6d206772616e6470612073657420494420746f2074686520696e646578206f6620746865202a6d6f737420726563656e742a2073657373696f6e20666f722077686963682069747368206d656d62657273207765726520726573706f6e7369626c652e00b82054574f582d4e4f54453a2060536574496460206973206e6f7420756e646572207573657220636f6e74726f6c2e01790501a404384d6178417574686f7269746965731010a0860100045c204d617820417574686f72697469657320696e2075736501b5070b48417574686f72697479446973636f766572790148417574686f72697479446973636f7665727908104b6579730100b9070400048c204b657973206f66207468652063757272656e7420617574686f72697479207365742e204e6578744b6579730100b90704000480204b657973206f6620746865206e65787420617574686f72697479207365742e000000000c20496d4f6e6c696e650120496d4f6e6c696e651038486561727462656174416674657201001010000000002c1d012054686520626c6f636b206e756d6265722061667465722077686963682069742773206f6b20746f2073656e64206865617274626561747320696e207468652063757272656e74242073657373696f6e2e0025012041742074686520626567696e6e696e67206f6620656163682073657373696f6e20776520736574207468697320746f20612076616c756520746861742073686f756c642066616c6c350120726f7567686c7920696e20746865206d6964646c65206f66207468652073657373696f6e206475726174696f6e2e20546865206964656120697320746f206669727374207761697420666f721901207468652076616c696461746f727320746f2070726f64756365206120626c6f636b20696e207468652063757272656e742073657373696f6e2c20736f207468617420746865a820686561727462656174206c61746572206f6e2077696c6c206e6f74206265206e65636573736172792e00390120546869732076616c75652077696c6c206f6e6c79206265207573656420617320612066616c6c6261636b206966207765206661696c20746f2067657420612070726f7065722073657373696f6e2d012070726f677265737320657374696d6174652066726f6d20604e65787453657373696f6e526f746174696f6e602c2061732074686f736520657374696d617465732073686f756c642062650101206d6f7265206163637572617465207468656e207468652076616c75652077652063616c63756c61746520666f7220604865617274626561744166746572602e104b6579730100c107040004d0205468652063757272656e7420736574206f66206b6579732074686174206d61792069737375652061206865617274626561742e485265636569766564486561727462656174730001080505c103c9070400083d0120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206053657373696f6e496e6465786020616e64206041757468496e6465786020746fb02060577261707065724f70617175653c426f756e6465644f70617175654e6574776f726b53746174653e602e38417574686f726564426c6f636b730101080505550710100000000008150120466f7220656163682073657373696f6e20696e6465782c207765206b6565702061206d617070696e67206f66206056616c696461746f7249643c543e6020746f20746865c8206e756d626572206f6620626c6f636b7320617574686f7265642062792074686520676976656e20617574686f726974792e01a90501b80440556e7369676e65645072696f726974792020ffffffffffffffff10f0204120636f6e66696775726174696f6e20666f722062617365207072696f72697479206f6620756e7369676e6564207472616e73616374696f6e732e0015012054686973206973206578706f73656420736f20746861742069742063616e2062652074756e656420666f7220706172746963756c61722072756e74696d652c207768656eb4206d756c7469706c652070616c6c6574732073656e6420756e7369676e6564207472616e73616374696f6e732e01dd070d204f6666656e63657301204f6666656e6365730c1c5265706f7274730001040524e107040004490120546865207072696d61727920737472756374757265207468617420686f6c647320616c6c206f6666656e6365207265636f726473206b65796564206279207265706f7274206964656e746966696572732e58436f6e63757272656e745265706f727473496e6465780101080505e507b9030400042901204120766563746f72206f66207265706f727473206f66207468652073616d65206b696e6420746861742068617070656e6564206174207468652073616d652074696d6520736c6f742e485265706f72747342794b696e64496e64657801010405e028040018110120456e756d65726174657320616c6c207265706f727473206f662061206b696e6420616c6f6e672077697468207468652074696d6520746865792068617070656e65642e00bc20416c6c207265706f7274732061726520736f72746564206279207468652074696d65206f66206f6666656e63652e004901204e6f74652074686174207468652061637475616c2074797065206f662074686973206d617070696e6720697320605665633c75383e602c207468697320697320626563617573652076616c756573206f66690120646966666572656e7420747970657320617265206e6f7420737570706f7274656420617420746865206d6f6d656e7420736f2077652061726520646f696e6720746865206d616e75616c2073657269616c697a6174696f6e2e0001dc00000e6052616e646f6d6e657373436f6c6c656374697665466c6970016052616e646f6d6e657373436f6c6c656374697665466c6970043852616e646f6d4d6174657269616c0100e90704000c610120536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e2054686973610120697320617272616e67656420617320612072696e672062756666657220776974682060626c6f636b5f6e756d626572202520383160206265696e672074686520696e64657820696e746f20746865206056656360206f664420746865206f6c6465737420686173682e000000000f105375646f01105375646f040c4b6579000000040004842054686520604163636f756e74496460206f6620746865207375646f206b65792e01c90501e40001ed071020426167734c6973740120426167734c6973740c244c6973744e6f6465730001040500f10704000c8020412073696e676c65206e6f64652c2077697468696e20736f6d65206261672e000501204e6f6465732073746f7265206c696e6b7320666f727761726420616e64206261636b2077697468696e207468656972207265737065637469766520626167732e4c436f756e746572466f724c6973744e6f646573010010100000000004ac436f756e74657220666f72207468652072656c6174656420636f756e7465642073746f72616765206d6170204c697374426167730001040520f50704000c642041206261672073746f72656420696e2073746f726167652e0019012053746f7265732061206042616760207374727563742c2077686963682073746f726573206865616420616e64207461696c20706f696e7465727320746f20697473656c662e01cd0501ec04344261675468726573686f6c647301010919210300407a10f35a00006a70ccd4a96000009ef3397fbc660000a907ccd5306d00003d9a67fb0c740000a9bfa275577b0000a6fdf73217830000034f5d91538b0000132445651494000078081001629d00000302f63c45a70000392e6f7fc7b10000f59c23c6f2bc00004ae76aafd1c80000598a64846fd50000129fb243d8e200003f22e1ac18f1000033a4844c3e000100e2e51b895710010076a2c0b0732101006789b407a3330100793ed8d7f646010078131b81815b01000c1cf38a567101004437eeb68a8801009eb56d1434a10100335e9f156abb010067c3c7a545d701003218f340e1f40100de0b230d59140200699c11f5ca350200ad50a2c4565902009ae41c471e7f0200d0244e6745a70200f984ad51f2d10200ace7a7984dff0200a118325b822f0300ffa4c76dbe620300580bfd8532990300a9afce6812d30300109ad81b95100400d9caa519f551040038df488970970400bee1727949e10400cc73401fc62f0500b304f91831830500828bffb4d9db05001235383d143a0600a5b42a473a9e060036662d09ab080700f73aeab4cb790700b87e93d707f20700ffec23c0d1710800b84b0beca2f90800c9dcae7afc89090091752ba867230a0064f1cd4f76c60a003609be76c3730b0078655fdff32b0c00a407f5a5b6ef0c0052f61be7c5bf0d00da71bb70e79c0e000de9127eed870f001477987fb7811000ebee65ef328b11001269fe325ca5120033f8428b3fd113008ba57a13fa0f15001b2b60d0ba6216000d1d37d0c3ca17006c64fa5c6b4919002622c7411de01a00045bb9245c901c00233d83f6c25b1e00c8771c79064420003013fddef64a2200aa8b6e848172240082c096c4b2bc260016a3faebb72b29008296524ae1c12b00a636a865a4812e00d0e2d4509e6d31009c0a9a2796883400e4faafb27fd53700e6e64d367e573b000e4bd66de7113f0088b17db746084300b07def72603e470034de249635b84b00d48bd57b077a5000d0bd20ef5b885500b8f0467801e85a0010f88aee139e60003892925301b066009c95e4fc8e236d00b4126d10dffe730028b43e5976487b00a08a1c7a42078300b09ab083a0428b002846b2f463029400c861a42ade4e9d0050d23d4ae630a700805101a7e1b1b10038e501b2ccdbbc002016527844b9c800388924ba9055d50070ca35a4aebce200805fb1355cfbf0008035685d241f0001a0c3dcd96b361001d07862e87e50210160e852d09f7d330190662c5816cf460110274c3340575b01804be277a22971013082b92dfc5a880180d276075a01a101b0f511592b34bb014031745f580cd701802f6cee59a4f40140ff799b521814026075607d2986350260fde999a60d590200e5e71c91d07e02c0df2575cff2a602a07fd975899ad102a067009d4cf0fe0220dc29a1321f2f0320ff526b0a5562038088caa383c29803e05683fb5c9bd203401dd75d9516100400317e39a06e5104c0b071129de1960480b48c9192b1e00480e8124aad242f05c007ca7082858205007c13c45623db0540836fe869523906c0700f81466c9d0640f09c5017d00707c0e624b301e37807c0332ac78510f10780074ca1e4ca700800d5a9eb8c8bf80800a849588ed3880900804254142c220a80a25170e826c50a00e8d5fafc5e720b801df64e00792a0c80d4fe64f923ee0c006dd038ee19be0d001e90a494209b0e0010bf570e0a860f00da6a9db0b57f1000bf64afd810891100bb5b60cd17a31200f963f3aed6ce1300d5f004766a0d1500e099770202601600103d663bdfc71700de3e2d4158461900ecdbadb2d8dc1a0045c70007e38c1c00b8bde0fc11581e00ba5c2a211a402000407de46dcb462200dea55b03136e2400aaf1f3fcfcb7260014226f63b62629006492803e8fbc2b008486a6c7fc7b2e002cf05fc09b673100da63f7ed32823400f0b13fbdb5ce3700f291c41047503b00422a1a3c3c0a3f002c24212f20004300ac9342d4b6354700cc6ed7a400af4b00c4d022773e70500020017d89f57d5500f86387cef3dc5a008c4c7f7e54926000206207f284a36600cc1e05cb49166d00b42a7a70c4f07300d43a90e278397b0038f461ec53f78200a07264b9b1318b0048c9b3d464f09300007fe998bd3b9d0010058f17921ca70000dfaf7f469cb100e80c880bd6c4bc0058bdcb7ddca0c80038d18d37a03bd50030d55bf01ca1e200704ac01a0fdef0ffffffffffffffffacd020546865206c697374206f66207468726573686f6c64732073657061726174696e672074686520766172696f757320626167732e00490120496473206172652073657061726174656420696e746f20756e736f727465642062616773206163636f7264696e6720746f2074686569722073636f72652e205468697320737065636966696573207468656101207468726573686f6c64732073657061726174696e672074686520626167732e20416e20696427732062616720697320746865206c6172676573742062616720666f722077686963682074686520696427732073636f7265b8206973206c657373207468616e206f7220657175616c20746f20697473207570706572207468726573686f6c642e006501205768656e20696473206172652069746572617465642c2068696768657220626167732061726520697465726174656420636f6d706c6574656c79206265666f7265206c6f77657220626167732e2054686973206d65616e735901207468617420697465726174696f6e206973205f73656d692d736f727465645f3a20696473206f66206869676865722073636f72652074656e6420746f20636f6d65206265666f726520696473206f66206c6f7765722d012073636f72652c206275742070656572206964732077697468696e206120706172746963756c6172206261672061726520736f7274656420696e20696e73657274696f6e206f726465722e006820232045787072657373696e672074686520636f6e7374616e74004d01205468697320636f6e7374616e74206d75737420626520736f7274656420696e207374726963746c7920696e6372656173696e67206f726465722e204475706c6963617465206974656d7320617265206e6f742c207065726d69747465642e00410120546865726520697320616e20696d706c696564207570706572206c696d6974206f66206053636f72653a3a4d4158603b20746861742076616c756520646f6573206e6f74206e65656420746f2062652101207370656369666965642077697468696e20746865206261672e20466f7220616e792074776f207468726573686f6c64206c697374732c206966206f6e6520656e647320776974683101206053636f72653a3a4d4158602c20746865206f74686572206f6e6520646f6573206e6f742c20616e64207468657920617265206f746865727769736520657175616c2c207468652074776f7c206c697374732077696c6c20626568617665206964656e746963616c6c792e003820232043616c63756c6174696f6e005501204974206973207265636f6d6d656e64656420746f2067656e65726174652074686520736574206f66207468726573686f6c647320696e20612067656f6d6574726963207365726965732c2073756368207468617441012074686572652065786973747320736f6d6520636f6e7374616e7420726174696f2073756368207468617420607468726573686f6c645b6b202b20315d203d3d20287468726573686f6c645b6b5d202ad020636f6e7374616e745f726174696f292e6d6178287468726573686f6c645b6b5d202b2031296020666f7220616c6c20606b602e005901205468652068656c7065727320696e2074686520602f7574696c732f6672616d652f67656e65726174652d6261677360206d6f64756c652063616e2073696d706c69667920746869732063616c63756c6174696f6e2e002c2023204578616d706c6573005101202d20496620604261675468726573686f6c64733a3a67657428292e69735f656d7074792829602c207468656e20616c6c20696473206172652070757420696e746f207468652073616d65206261672c20616e64b0202020697465726174696f6e206973207374726963746c7920696e20696e73657274696f6e206f726465722e6101202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d203634602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f11012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320657175616c20746f20322e6501202d20496620604261675468726573686f6c64733a3a67657428292e6c656e2829203d3d20323030602c20616e6420746865207468726573686f6c6473206172652064657465726d696e6564206163636f7264696e6720746f59012020207468652070726f63656475726520676976656e2061626f76652c207468656e2074686520636f6e7374616e7420726174696f20697320617070726f78696d6174656c7920657175616c20746f20312e3234382e6101202d20496620746865207468726573686f6c64206c69737420626567696e7320605b312c20322c20332c202e2e2e5d602c207468656e20616e20696420776974682073636f72652030206f7220312077696c6c2066616c6cf0202020696e746f2062616720302c20616e20696420776974682073636f726520322077696c6c2066616c6c20696e746f2062616720312c206574632e00302023204d6967726174696f6e00610120496e20746865206576656e7420746861742074686973206c6973742065766572206368616e6765732c206120636f7079206f6620746865206f6c642062616773206c697374206d7573742062652072657461696e65642e5d012057697468207468617420604c6973743a3a6d696772617465602063616e2062652063616c6c65642c2077686963682077696c6c20706572666f726d2074686520617070726f707269617465206d6967726174696f6e2e01f907111c56657374696e67011c56657374696e67081c56657374696e6700010402000108040004d820496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e3853746f7261676556657273696f6e0100090804000c7c2053746f726167652076657273696f6e206f66207468652070616c6c65742e003101204e6577206e6574776f726b732073746172742077697468206c61746573742076657273696f6e2c2061732064657465726d696e6564206279207468652067656e65736973206275696c642e01d10501f008444d696e5665737465645472616e736665721840aa821bce26000000000000000000000004e820546865206d696e696d756d20616d6f756e74207472616e7366657272656420746f2063616c6c20607665737465645f7472616e73666572602e4c4d617856657374696e675363686564756c657310101c00000000010d0812204d756c746973696701204d756c746973696708244d756c746973696773000108050211081508040004942054686520736574206f66206f70656e206d756c7469736967206f7065726174696f6e732e1443616c6c730001040604190804000001d90501f40c2c4465706f736974426173651840d042de1300000000000000000000000018590120546865206261736520616d6f756e74206f662063757272656e6379206e656564656420746f207265736572766520666f72206372656174696e672061206d756c746973696720657865637574696f6e206f7220746f842073746f726520612064697370617463682063616c6c20666f72206c617465722e00010120546869732069732068656c6420666f7220616e206164646974696f6e616c2073746f72616765206974656d2077686f73652076616c75652073697a652069733101206034202b2073697a656f662828426c6f636b4e756d6265722c2042616c616e63652c204163636f756e74496429296020627974657320616e642077686f7365206b65792073697a652069738020603332202b2073697a656f66284163636f756e74496429602062797465732e344465706f736974466163746f72184040cd2d030000000000000000000000000c55012054686520616d6f756e74206f662063757272656e6379206e65656465642070657220756e6974207468726573686f6c64207768656e206372656174696e672061206d756c746973696720657865637574696f6e2e00250120546869732069732068656c6420666f7220616464696e67203332206279746573206d6f726520696e746f2061207072652d6578697374696e672073746f726167652076616c75652e384d61785369676e61746f72696573090408640004ec20546865206d6178696d756d20616d6f756e74206f66207369676e61746f7269657320616c6c6f77656420696e20746865206d756c74697369672e011d08131c436f756e63696c011c436f756e63696c24145374616765010021082402010000000000000004742043757272656e7420636f756e63696c20766f74696e6720737461676538436f756e63696c4d656d6265727301003508040004602043757272656e7420636f756e63696c206d656d626572732843616e64696461746573000104022041080400041101204d6170206f6620616c6c2063616e64696461746573207468617420657665722063616e6469646174656420616e6420686176656e277420756e7374616b65207965742e50416e6e6f756e63656d656e74506572696f644e72010020200000000000000000085d0120496e646578206f66207468652063757272656e742063616e64696461637920706572696f642e20497420697320696e6372656d656e74656420657665727974696d6520616e6e6f756e63656d656e7420706572696f6420207374617274732e18427564676574010018400000000000000000000000000000000004c82042756467657420666f722074686520636f756e63696c277320656c6563746564206d656d6265727320726577617264732e484e6578745265776172645061796d656e7473010010100000000004290120546865206e65787420626c6f636b20696e2077686963682074686520656c656374656420636f756e63696c206d656d62657220726577617264732077696c6c2062652070617965642e404e657874427564676574526566696c6c010010100000000004d820546865206e65787420626c6f636b20696e20776869636820746865206275646765742077696c6c20626520696e637265617365642e3c427564676574496e6372656d656e74010018400000000000000000000000000000000004d420416d6f756e74206f662062616c616e636520746f20626520726566696c6c65642065766572792062756467657420706572696f643c436f756e63696c6f725265776172640100184000000000000000000000000000000000046c20436f756e63696c6f72207265776172642070657220626c6f636b01e50501fc24684d696e4e756d6265724f66457874726143616e64696461746573101000000000080901204d696e696d756d206e756d626572206f662065787472612063616e64696461746573206e656564656420666f72207468652076616c696420656c656374696f6e2e2d01204e756d626572206f6620746f74616c2063616e6469646174657320697320657175616c20746f20636f756e63696c2073697a6520706c75732065787472612063616e646964617465732e2c436f756e63696c53697a65101003000000045420436f756e63696c206d656d62657220636f756e74444d696e43616e6469646174655374616b651840a010a012d3eb050000000000000000000490204d696e696d756d207374616b652063616e6469646174652068617320746f206c6f636b60416e6e6f756e63696e67506572696f644475726174696f6e101040fa01000474204475726174696f6e206f6620616e6e6f6e63696e6720706572696f644849646c65506572696f644475726174696f6e1010010000000460204475726174696f6e206f662069646c6520706572696f6464456c65637465644d656d626572526577617264506572696f6410104038000004a020496e74657276616c20666f72206175746f6d6174696320726577617264207061796d656e74732e48427564676574526566696c6c506572696f6410104038000004ac20496e74657276616c206265747765656e206175746f6d617469632062756467657420726566696c6c732e3c43616e6469646163794c6f636b496405042063616e6469646163048c204578706f72747320636f6e7374202d2063616e646964616379206c6f636b2069642e3c436f756e63696c6f724c6f636b4964050420636f756e63696c6f048c204578706f72747320636f6e7374202d20636f756e63696c6f72206c6f636b2069642e01450814285265666572656e64756d014c496e7374616e6365315265666572656e64756d0814537461676501004908040004682043757272656e74207265666572656e64756d2073746167652e14566f74657301010402005908e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018510120566f746573206361737420696e20746865207265666572656e64756d2e2041206e6577207265636f726420697320616464656420746f2074686973206d6170207768656e20612075736572206361737473206134207365616c656420766f74652e0101204974206973206d6f646966696564207768656e206120757365722072657665616c732074686520766f7465277320636f6d6d69746d656e742070726f6f662e55012041207265636f72642069732066696e616c6c792072656d6f766564207768656e20746865207573657220756e7374616b65732c2077686963682063616e2068617070656e20647572696e67206120766f74696e679c207374616765206f72206166746572207468652063757272656e74206379636c6520656e64732ef82041207374616b6520666f72206120766f74652063616e2062652072657573656420696e20667574757265207265666572656e64756d206379636c65732e01e90501050114344d617853616c744c656e67746820202000000000000000085d01204d6178696d756d206c656e677468206f6620766f746520636f6d6d69746d656e742073616c742e20557365206c656e677468207468617420656e737572657320756e697175656e65737320666f722068617368696e675020652e672e207374643a3a7536343a3a4d41582e44566f746553746167654475726174696f6e1010c0a8000004b0204475726174696f6e206f6620766f74696e6720737461676520286e756d626572206f6620626c6f636b73294c52657665616c53746167654475726174696f6e1010c0a8000004bc204475726174696f6e206f662072657665616c696e6720737461676520286e756d626572206f6620626c6f636b7329304d696e696d756d5374616b651840a41a130d8401000000000000000000000480204d696e696d756d207374616b65206e656564656420666f7220766f74696e67505374616b696e6748616e646c65724c6f636b4964050420766f74696e67202004a4204578706f72747320636f6e7374202d207374616b696e672068616e646c6572206c6f636b2069642e015d08151c4d656d6265727301284d656d6265727368697020304e6578744d656d6265724964010020200000000000000000084501204d656d626572496420746f2061737369676e20746f206e657874206d656d626572207468617420697320616464656420746f207468652072656769737472792c20616e6420697320616c736f20746865e820746f74616c206e756d626572206f66206d656d6265727320637265617465642e204d656d626572496473207374617274206174205a65726f2e384d656d626572736869704279496400010402206108040004d0204d617070696e67206f66206d656d626572277320696420746f207468656972206d656d626572736869702070726f66696c652e504d656d6265724964427948616e646c6548617368010104022420200000000000000000040501205265676973746572656420756e697175652068616e646c6573206861736820616e64207468656972206d617070696e6720746f207468656972206f776e65722e2c526566657272616c437574010008040004410120526566657272616c206375742070657263656e74206f6620746865206d656d626572736869702066656520746f2072656365697665206f6e20627579696e6720746865206d656d626572736869702e3c4d656d62657273686970507269636501001840aa821bce26000000000000000000000004682043757272656e74206d656d626572736869702070726963652e58496e697469616c496e7669746174696f6e436f756e74010010100000000004e820496e697469616c20696e7669746174696f6e20636f756e7420666f7220746865206e65776c7920626f75676874206d656d626572736869702e60496e697469616c496e7669746174696f6e42616c616e63650100184034c10d6713000000000000000000000004cc20496e697469616c20696e7669746174696f6e2062616c616e636520666f722074686520696e7669746564206d656d6265722e705374616b696e674163636f756e7449644d656d626572537461747573010104020065082400000000000000000004250120446f75626c65206f662061207374616b696e67206163636f756e7420696420616e64206d656d62657220696420746f2074686520636f6e6669726d6174696f6e207374617475732e01ed05011501185844656661756c744d656d6265727368697050726963651840aa821bce26000000000000000000000004a0204578706f72747320636f6e7374202d2064656661756c74206d656d62657273686970206665652e64526566657272616c4375744d6178696d756d50657263656e74080432044901204578706f72747320636f6e7374202d206d6178696d756d2070657263656e742076616c7565206f6620746865206d656d626572736869702066656520666f722074686520726566657272616c206375742e7c44656661756c74496e697469616c496e7669746174696f6e42616c616e6365184034c10d6713000000000000000000000004e0204578706f72747320636f6e7374202d2064656661756c742062616c616e636520666f722074686520696e7669746564206d656d6265722e3843616e6469646174655374616b651840a41a130d84010000000000000000000004f8204578706f72747320636f6e7374202d205374616b65206e656564656420746f2063616e646964617465206173207374616b696e67206163636f756e742e4c496e76697465644d656d6265724c6f636b4964050420696e766974656d6204a0204578706f72747320636f6e7374202d20696e7669746564206d656d626572206c6f636b2069642e585374616b696e6743616e6469646174654c6f636b4964050420626f756e6473746104ac204578706f72747320636f6e7374202d207374616b696e672063616e646964617465206c6f636b2069642e0169081614466f72756d0124466f72756d5f315f31203043617465676f72794279496401010402206d083d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004cc204d61702063617465676f7279206964656e74696669657220746f20636f72726573706f6e64696e672063617465676f72792e384e65787443617465676f727949640100202000000000000000000411012043617465676f7279206964656e7469666965722076616c756520746f206265207573656420666f7220746865206e6578742043617465676f727920637265617465642e3c43617465676f7279436f756e746572010020200000000000000000049420436f756e74657220666f7220616c6c206578697374696e672063617465676f726965732e285468726561644279496401010802025d037508a4000000000000000000000000000000000000000000000000000000000000000000000000000000000004bc204d617020746872656164206964656e74696669657220746f20636f72726573706f6e64696e67207468726561642e304e657874546872656164496401002020000000000000000004090120546872656164206964656e7469666965722076616c756520746f206265207573656420666f72206e6578742054687265616420696e20746872656164427949642e284e657874506f7374496401002020000000000000000004f020506f7374206964656e7469666965722076616c756520746f206265207573656420666f7220666f72206e65787420706f737420637265617465642e4c43617465676f727942794d6f64657261746f7201010802025d0374000480204d6f64657261746f722073657420666f7220656163682043617465676f727920506f73744279496401010802025d037908150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ac204d617020706f7374206964656e74696669657220746f20636f72726573706f6e64696e6720706f73742e01f105013501102c506f73744465706f736974184083890d730000000000000000000000000838204578706f72747320636f6e737480204465706f736974206e656564656420746f20637265617465206120706f7374345468726561644465706f736974184099b06c6f0000000000000000000000000488204465706f736974206e656564656420746f20637265617465206120746872656164804d617844697265637453756263617465676f72696573496e43617465676f7279202005000000000000000484204d617844697265637453756263617465676f72696573496e43617465676f7279484d6178546f74616c43617465676f7269657320202800000000000000044c204d6178546f74616c43617465676f72696573017d081730436f6e737469747574696f6e0130436f6e737469747574696f6e0430436f6e737469747574696f6e010081088000000000000000000000000000000000000000000000000000000000000000000001f50501510100001818426f756e74790118426f756e74791420426f756e74696573010104022085087d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044020426f756e74792073746f726167652e4c426f756e7479436f6e747269627574696f6e73010108020299089d0880000000000000000000000000000000005084c06c000000000000000000000000044d0120446f75626c65206d617020666f7220626f756e74792066756e64696e672e2049742073746f7265732061206d656d626572206f7220636f756e63696c2066756e64696e6720666f7220626f756e746965732e2c426f756e7479436f756e74010010100000000004b820436f756e74206f6620616c6c20626f756e7469657320746861742068617665206265656e20637265617465642e1c456e747269657300010802025d03a1080400046020576f726b20656e7472792073746f72616765206d61702e28456e747279436f756e74010010100000000004c820436f756e74206f6620616c6c20776f726b20656e747269657320746861742068617665206265656e20637265617465642e01f905015501105c436c6f736564436f6e747261637453697a654c696d6974101032000000044d01204578706f72747320636f6e7374202d206d617820776f726b20656e747279206e756d62657220666f72206120636c6f736564206173737572616e6365207479706520636f6e747261637420626f756e74792e4c4d696e576f726b456e7472616e745374616b651840958ed36d00000000000000000000000004d4204578706f72747320636f6e7374202d206d696e20776f726b20656e7472616e74207374616b6520666f72206120626f756e74792e6846756e6465725374617465426c6f6174426f6e64416d6f756e7418405084c06c00000000000000000000000004f4204578706f72747320636f6e7374202d2066756e64657220737461746520626c6f617420626f6e6420616d6f756e7420666f72206120626f756e74792e6c43726561746f725374617465426c6f6174426f6e64416d6f756e7418400e16e46c00000000000000000000000004f8204578706f72747320636f6e7374202d2063726561746f7220737461746520626c6f617420626f6e6420616d6f756e7420666f72206120626f756e74792e01a50819404a6f7973747265616d5574696c69747901404a6f7973747265616d5574696c6974790001fd050179010001a9081a1c436f6e74656e74011c436f6e74656e74842c4368616e6e656c4279496401010402208d01a10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024566964656f427949640101040220ad086c00000000000000000000000000000000000000000000000000000000344e6578744368616e6e656c4964010020200000000000000000002c4e657874566964656f496401002020000000000000000000384e6578745472616e73666572496401002020000000000000000000484e65787443757261746f7247726f75704964010020200000000000000000004043757261746f7247726f7570427949640101040220d9080c0000000028436f6d6d69746d656e7401002480000000000000000000000000000000000000000000000000000000000000000000684368616e6e656c5374617465426c6f6174426f6e6456616c756501001840000000000000000000000000000000000425012054686520737461746520626c6f617420626f6e6420666f7220746865206368616e6e656c202868656c70732070726576656e74696e672074686520737461746520626c6f6174292e60566964656f5374617465426c6f6174426f6e6456616c7565010018400000000000000000000000000000000004190154686520737461746520626c6f617420626f6e6420666f722074686520766964656f202868656c70732070726576656e74696e672074686520737461746520626c6f6174292e444d6178436173686f7574416c6c6f776564010018400000000000000000000000000000000000444d696e436173686f7574416c6c6f776564010018400000000000000000000000000000000000584368616e6e656c436173686f757473456e61626c6564010088040000484d696e41756374696f6e4475726174696f6e01001010000000000454204d696e2061756374696f6e206475726174696f6e484d617841756374696f6e4475726174696f6e01001010000000000454204d61782061756374696f6e206475726174696f6e644d696e41756374696f6e457874656e73696f6e506572696f6401001010000000000474204d696e2061756374696f6e20657874656e73696f6e20706572696f64644d617841756374696f6e457874656e73696f6e506572696f6401001010000000000474204d61782061756374696f6e20657874656e73696f6e20706572696f64484d696e4269644c6f636b4475726174696f6e01001010000000000458204d696e20626964206c6f636b206475726174696f6e484d61784269644c6f636b4475726174696f6e01001010000000000458204d617820626964206c6f636b206475726174696f6e404d696e5374617274696e67507269636501001840000000000000000000000000000000000468204d696e2061756374696f6e2073746172696e67207072696365404d61785374617274696e67507269636501001840000000000000000000000000000000000468204d61782061756374696f6e2073746172696e67207072696365444d696e43726561746f72526f79616c747901009c1000000000047c204d696e2063726561746f7220726f79616c74792070657263656e74616765444d617843726561746f72526f79616c747901009c1000000000047c204d61782063726561746f7220726f79616c74792070657263656e74616765284d696e4269645374657001001840000000000000000000000000000000000454204d696e2061756374696f6e206269642073746570284d61784269645374657001001840000000000000000000000000000000000454204d61782061756374696f6e20626964207374657054506c617466726f6d46656550657263656e7461676501009c1000000000046020506c6174666f726d206665652070657263656e746167655c41756374696f6e53746172747341744d617844656c7461010010100000000004b8204d61782064656c7461206265747765656e2063757272656e7420626c6f636b20616e6420737461727473206174784f70656e41756374696f6e4269644279566964656f416e644d656d62657201010802025d03f5087000000000000000000000000000000000000000000000000000000000045c204269647320666f72206f70656e2061756374696f6e7354476c6f62616c4461696c794e6674436f756e7465720100dd0130000000000000000000000000046820476c6f62616c206461696c79204e465420636f756e7465722e58476c6f62616c5765656b6c794e6674436f756e7465720100dd0130000000000000000000000000046c20476c6f62616c207765656b6c79204e465420636f756e7465722e4c476c6f62616c4461696c794e66744c696d69740100d90130000000000000000000000000046020476c6f62616c206461696c79204e4654206c696d69742e50476c6f62616c5765656b6c794e66744c696d69740100d90130000000000000000000000000046420476c6f62616c207765656b6c79204e4654206c696d69742e404e66744c696d697473456e61626c656401008804000868204e4654206c696d69747320656e61626c6564206f72206e6f74a02043616e206265207570646174656420696e20666c696768742062792074686520436f756e63696c0101060185011c6c4d61784e756d6265724f6643757261746f727350657247726f757010100a00000004c4204578706f72747320636f6e7374202d206d6178206e756d626572206f662063757261746f7273207065722067726f7570ac4d61784b65797350657243757261746f7247726f75705065726d697373696f6e7342794c6576656c4d6170101019000000045d01204578706f72747320636f6e7374202d206d6178206e756d626572206f66206b657973207065722063757261746f725f67726f75702e7065726d697373696f6e735f62795f6c6576656c206d617020696e7374616e6365704d61784e667441756374696f6e57686974656c6973744c656e67746810101400000004c4204578706f72747320636f6e7374202d206d6178206e66742061756374696f6e2077686974656c697374206c656e6774686844656661756c74476c6f62616c4461696c794e66744c696d6974d9013064000000000000004038000004c0204578706f72747320636f6e7374202d2064656661756c7420676c6f62616c206461696c79204e4654206c696d69742e6c44656661756c74476c6f62616c5765656b6c794e66744c696d6974d9013064000000000000004038000004c4204578706f72747320636f6e7374202d2064656661756c7420676c6f62616c207765656b6c79204e4654206c696d69742e6c44656661756c744368616e6e656c4461696c794e66744c696d6974d9013064000000000000004038000004c4204578706f72747320636f6e7374202d2064656661756c74206368616e6e656c206461696c79204e4654206c696d69742e7044656661756c744368616e6e656c5765656b6c794e66744c696d6974d9013064000000000000004038000004c8204578706f72747320636f6e7374202d2064656661756c74206368616e6e656c207765656b6c79204e4654206c696d69742e01f9081b1c53746f72616765011c53746f726167654c4055706c6f6164696e67426c6f636b6564010088040004a020446566696e6573207768657468657220616c6c206e65772075706c6f61647320626c6f636b65641042616773010104027902fd0848000000000000000000000000000000000000044820426167732073746f72616765206d61702e4c4e65787453746f726167654275636b6574496401002020000000000000000004ac2053746f72616765206275636b657420696420636f756e7465722e20537461727473206174207a65726f2e404e657874446174614f626a656374496401002020000000000000000004a02044617461206f626a65637420696420636f756e7465722e20537461727473206174207a65726f2e4453746f726167654275636b65744279496400010402200909040004442053746f72616765206275636b6574732e24426c61636b6c6973740101040211097400048020426c61636b6c69737465642064617461206f626a656374206861736865732e5043757272656e74426c61636b6c69737453697a65010020200000000000000000047820426c61636b6c69737420636f6c6c656374696f6e20636f756e7465722e60446174614f626a6563745065724d65676162797465466565010018400000000000000000000000000000000004b02053697a652062617365642070726963696e67206f66206e6577206f626a656374732075706c6f616465642e6453746f726167654275636b6574735065724261674c696d6974010010100000000004a0202253746f72616765206275636b657473207065722062616722206e756d626572206c696d69742e68566f75636865724d61784f626a6563747353697a654c696d697401002020000000000000000004f820224d6178206f626a656374732073697a6520666f7220612073746f72616765206275636b657420766f756368657222206e756d626572206c696d69742e70566f75636865724d61784f626a656374734e756d6265724c696d697401002020000000000000000004050120224d6178206f626a65637473206e756d62657220666f7220612073746f7261676520206275636b657420766f756368657222206e756d626572206c696d69742e74446174614f626a6563745374617465426c6f6174426f6e6456616c756501001840000000000000000000000000000000000439012054686520737461746520626c6f617420626f6e6420666f72207468652064617461206f626a65637473202868656c70732070726576656e74696e672074686520737461746520626c6f6174292e6844796e616d69634261674372656174696f6e506f6c6963696573010104029502150914000000000004c82044796e616d69634261674372656174696f6e506f6c6963792062792062616720747970652073746f72616765206d61702e3c446174614f626a656374734279496401010802021d0921096c00000000000000000000000000000000000000000000000000000004b0202744617461206f626a6563747320666f722062616773272073746f7261676520646f75626c65206d61702e784e657874446973747269627574696f6e4275636b657446616d696c79496401002020000000000000000004dc20446973747269627574696f6e206275636b65742066616d696c7920696420636f756e7465722e20537461727473206174207a65726f2e70446973747269627574696f6e4275636b657446616d696c794279496401010402202509200000000000000000047820446973747269627574696f6e206275636b65742066616d696c6965732e80446973747269627574696f6e4275636b6574427946616d696c7949644279496401010802025d0329093000000000000000000000000004a82027446973747269627574696f6e206275636b6574272073746f7261676520646f75626c65206d61702e78446973747269627574696f6e4275636b657446616d696c794e756d62657201002020000000000000000004f020546f74616c206e756d626572206f6620646973747269627574696f6e206275636b65742066616d696c69657320696e207468652073797374656d2e78446973747269627574696f6e4275636b6574735065724261674c696d6974010010100000000004b42022446973747269627574696f6e206275636b657473207065722062616722206e756d626572206c696d69742e0131060171022c48426c61636b6c69737453697a654c696d69742020e803000000000000040501204578706f72747320636f6e7374202d206d6178696d756d2073697a65206f662074686520226861736820626c61636b6c6973742220636f6c6c656374696f6e2e5c4d696e53746f726167654275636b65747350657242616710100300000004ec204578706f72747320636f6e7374202d206d696e696d756d206e756d626572206f662073746f72616765206275636b65747320706572206261672e5c4d617853746f726167654275636b65747350657242616710100d00000004ec204578706f72747320636f6e7374202d206d6178696d756d206e756d626572206f662073746f72616765206275636b65747320706572206261672e704d696e446973747269627574696f6e4275636b657473506572426167101001000000040101204578706f72747320636f6e7374202d206d696e696d756d206e756d626572206f6620646973747269627574696f6e206275636b65747320706572206261672e704d6178446973747269627574696f6e4275636b657473506572426167101033000000040101204578706f72747320636f6e7374202d206d6178696d756d206e756d626572206f6620646973747269627574696f6e206275636b65747320706572206261672eb444656661756c744d656d62657244796e616d69634261674e756d6265724f6653746f726167654275636b657473101005000000085101204578706f72747320636f6e7374202d207468652064656661756c742064796e616d696320626167206372656174696f6e20706f6c69637920666f72206d656d62657273202873746f72616765206275636b657424206e756d626572292eb844656661756c744368616e6e656c44796e616d69634261674e756d6265724f6653746f726167654275636b657473101005000000085501204578706f72747320636f6e7374202d207468652064656661756c742064796e616d696320626167206372656174696f6e20706f6c69637920666f72206368616e6e656c73202873746f72616765206275636b657424206e756d626572292e844d6178446973747269627574696f6e4275636b657446616d696c794e756d6265722020c80000000000000004fc204578706f72747320636f6e7374202d206d617820616c6c6f77656420646973747269627574696f6e206275636b65742066616d696c79206e756d6265722ec84d61784e756d6265724f6650656e64696e67496e7669746174696f6e73506572446973747269627574696f6e4275636b6574101014000000042d01204578706f72747320636f6e7374202d206d6178206e756d626572206f662070656e64696e6720696e7669746174696f6e732070657220646973747269627574696f6e206275636b65742ea44d61784e756d6265724f664f70657261746f7273506572446973747269627574696f6e4275636b6574101014000000040501204578706f72747320636f6e7374202d206d6178206e756d626572206f66206f70657261746f72732070657220646973747269627574696f6e206275636b65742e444d6178446174614f626a65637453697a652020000000000f00000004bc204578706f72747320636f6e7374202d206d61782064617461206f626a6563742073697a6520696e2062797465732e0135091c3050726f6a656374546f6b656e0114546f6b656e246c4163636f756e74496e666f4279546f6b656e416e644d656d62657201010802025d033909b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d0120446f75626c65206d617020546f6b656e49642078204d656d6265724964203d3e204163636f756e744461746120666f72206d616e6167696e67206163636f756e74206461746134546f6b656e496e666f4279496401010402206109cd010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004dc206d617020546f6b656e4964203d3e20546f6b656e4461746120746f20726574726965766520746f6b656e20696e666f726d6174696f6e2c4e657874546f6b656e4964010020200000000000000000043c20546f6b656e204964206e6f6e63652c53796d626f6c735573656401010402247400046c2053657420666f722074686520746f6b656e732073796d626f6c7324426c6f6174426f6e64010018400000000000000000000000000000000004b820426c6f617420426f6e642076616c7565207573656420647572696e67206163636f756e74206372656174696f6e3c4d696e53616c654475726174696f6e01001010000000000484204d696e696d756d206475726174696f6e206f66206120746f6b656e2073616c655c4d696e526576656e756553706c69744475726174696f6e010010100000000004a8204d696e696d756d20726576656e75652073706c6974206475726174696f6e20636f6e73747261696e74684d696e526576656e756553706c697454696d65546f5374617274010010100000000004bc204d696e696d756d20726576656e75652073706c69742074696d6520746f20737461727420636f6e73747261696e743c53616c65506c6174666f726d4665650100b9021000000000044d0120506c6174666f726d20666565202870657263656e74616765292063686172676564206f6e20746f70206f6620656163682073616c652070757263686173652028696e204a4f592920616e64206275726e656401350601a50200017d091d3c50726f706f73616c73456e67696e65013850726f706f73616c456e67696e65142450726f706f73616c73010104021081090101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000460204d61702070726f706f73616c206279206974732069642e3450726f706f73616c436f756e74010010100000000004bc20436f756e74206f6620616c6c2070726f706f73616c7320746861742068617665206265656e20637265617465642e50446973706174636861626c6543616c6c436f646501010402108d09040004b4204d61702070726f706f73616c2065786563757461626c6520636f64652062792070726f706f73616c2069642e4c41637469766550726f706f73616c436f756e740100101000000000046c20436f756e74206f66206163746976652070726f706f73616c732e6c566f7465457869737473427950726f706f73616c4279566f746572010108020291092103040104290120446f75626c65206d617020666f722070726576656e74696e67206475706c696361746520766f7465732e2053686f756c6420626520636c65616e65642061667465722075736167652e015d06010d03183c43616e63656c6c6174696f6e4665651840aa821bce260000000000000000000000047901204578706f72747320636f6e7374202d2074686520666565206973206170706c696564207768656e2063616e63656c207468652070726f706f73616c2e20412066656520776f756c6420626520736c617368656420286275726e6564292e3052656a656374696f6e4665651840528d8906c20000000000000000000000084501204578706f72747320636f6e7374202d202074686520666565206973206170706c696564207768656e207468652070726f706f73616c20676574732072656a65637465642e20412066656520776f756c645420626520736c617368656420286275726e6564292e385469746c654d61784c656e67746810102800000004d0204578706f72747320636f6e7374202d20206d617820616c6c6f7765642070726f706f73616c207469746c65206c656e6774682e504465736372697074696f6e4d61784c656e6774681010b80b000004e8204578706f72747320636f6e7374202d20206d617820616c6c6f7765642070726f706f73616c206465736372697074696f6e206c656e6774682e584d617841637469766550726f706f73616c4c696d697410101400000004ec204578706f72747320636f6e7374202d20206d61782073696d756c74616e656f7573206163746976652070726f706f73616c73206e756d6265722e505374616b696e6748616e646c65724c6f636b496405042070726f706f73616c04a4204578706f72747320636f6e7374202d207374616b696e672068616e646c6572206c6f636b2069642e0195091e4c50726f706f73616c7344697363757373696f6e014850726f706f73616c44697363757373696f6e10285468726561644279496401010402209909340000000000000000000000000004bc204d617020746872656164206964656e74696669657220746f20636f72726573706f6e64696e67207468726561642e2c546872656164436f756e7401002020000000000000000004b420436f756e74206f6620616c6c207468726561647320746861742068617665206265656e20637265617465642e50506f737454687265616449644279506f7374496401010802025d03a50974000000000000000000000000000000000000000000000000000000000004c4204d61702074687265616420696420616e6420706f737420696420746f20636f72726573706f6e64696e6720706f73742e24506f7374436f756e7401002020000000000000000004ac20436f756e74206f6620616c6c20706f73747320746861742068617665206265656e20637265617465642e0161060125030c404d617857686974654c69737453697a65101014000000040901204578706f72747320636f6e7374202d20617574686f72206c6973742073697a65206c696d697420666f722074686520436c6f7365642064697363757373696f6e2e2c506f73744465706f736974184092ef216e00000000000000000000000004a0204578706f72747320636f6e7374202d2066656520666f72206372656174696e67206120706f737430506f73744c69666554696d65101058020000043d01204578706f72747320636f6e7374202d206d6178696d756d206e756d626572206f6620626c6f636b73206265666f7265206120706f73742063616e2062652065726173656420627920616e796f6e6501a9091f3850726f706f73616c73436f646578013850726f706f73616c73436f64657804505468726561644964427950726f706f73616c496401010402102020000000000000000004b0204d61702070726f706f73616c20696420746f206974732064697363757373696f6e20746872656164206964016506012d0368985365744d617856616c696461746f72436f756e7450726f706f73616c506172616d65746572738509b4c0890100401901006400000064000000640000006400000001a010a012d3eb050000000000000000000300000004dc204578706f7274732027536574204d61782056616c696461746f7220436f756e74272070726f706f73616c20706172616d65746572732e8052756e74696d655570677261646550726f706f73616c506172616d65746572738509b4c0890100401901006400000064000000640000006400000001a010a012d3eb050000000000000000000400000004bc204578706f727473202752756e74696d652055706772616465272070726f706f73616c20706172616d65746572732e605369676e616c50726f706f73616c506172616d65746572738509b4c0a80000b004000064000000640000006400000064000000011068761b959700000000000000000000010000000498204578706f72747320275369676e616c272070726f706f73616c20706172616d65746572732e8046756e64696e675265717565737450726f706f73616c506172616d65746572738509b4c0a80000b00400004200000042000000640000006400000001a41a130d8401000000000000000000000100000004bc204578706f727473202746756e64696e672052657175657374272070726f706f73616c20706172616d65746572732ebc437265617465576f726b696e6747726f75704c6561644f70656e696e6750726f706f73616c506172616d65746572738509b4c0a80000b00400004200000042000000640000006400000001680abf82280f0000000000000000000001000000040501204578706f727473202743726561746520576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732ea446696c6c576f726b696e6747726f75704f70656e696e6750726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004fc204578706f727473202746696c6c20576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732ea8557064617465576f726b696e6747726f757042756467657450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004ec204578706f727473202755706461746520576f726b696e672047726f757020427564676574272070726f706f73616c20706172616d65746572732ebc4465637265617365576f726b696e6747726f75704c6561645374616b6550726f706f73616c506172616d65746572738509b4c0a80000b0040000640000006400000064000000640000000134855f4194070000000000000000000001000000040501204578706f7274732027446563726561736520576f726b696e672047726f7570204c656164205374616b65272070726f706f73616c20706172616d65746572732e9c536c617368576f726b696e6747726f75704c65616450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004e0204578706f7274732027536c61736820576f726b696e672047726f7570204c656164272070726f706f73616c20706172616d65746572732eac536574576f726b696e6747726f75704c65616452657761726450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004f4204578706f727473202753657420576f726b696e672047726f7570204c65616420526577617264272070726f706f73616c20706172616d65746572732eac5465726d696e617465576f726b696e6747726f75704c65616450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004f0204578706f72747320275465726d696e61746520576f726b696e672047726f7570204c656164272070726f706f73616c20706172616d65746572732e8c416d656e64436f6e737469747574696f6e50726f706f73616c506172616d65746572738509b4081a01004038000050000000640000003c0000005000000001680abf82280f000000000000000000000200000004c8204578706f7274732027416d656e6420436f6e737469747574696f6e272070726f706f73616c20706172616d65746572732ebc43616e63656c576f726b696e6747726f75704c6561644f70656e696e6750726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f4194070000000000000000000001000000040501204578706f727473202743616e63656c20576f726b696e672047726f7570204c656164204f70656e696e67272070726f706f73616c20706172616d65746572732e905365744d656d62657273686970507269636550726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000004d0204578706f7274732027536574204d656d62657273686970205072696365272070726f706f73616c20706172616d65746572732eac536574436f756e63696c427564676574496e6372656d656e7450726f706f73616c506172616d65746572738509b44019010040190100640000006400000064000000640000000120d0ec362a2f010000000000000000000300000004f0204578706f727473206053657420436f756e63696c2042756467657420496e6372656d656e74602070726f706f73616c20706172616d65746572732e90536574436f756e63696c6f7252657761726450726f706f73616c506172616d65746572738509b480700000c0a80000640000006400000064000000640000000120d0ec362a2f0100000000000000000002000000042101204578706f727473206053657420436f756e63696c6f72205265776172642050726f706f73616c20506172616d6574657273602070726f706f73616c20706172616d65746572732eb4536574496e697469616c496e7669746174696f6e42616c616e636550726f706f73616c506172616d65746572738509b480700000b00400004200000042000000640000006400000001d0147e05511e000000000000000000000100000004f8204578706f727473206053657420496e697469616c20496e7669746174696f6e2042616c616e6365602070726f706f73616c20706172616d65746572732e90536574496e7669746174696f6e436f756e7450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000000c85365744d656d626572736869704c656164496e7669746174696f6e51756f746150726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f41940700000000000000000000010000000080536574526566657272616c43757450726f706f73616c506172616d65746572738509b4c0a80000b0040000420000004200000064000000640000000134855f419407000000000000000000000100000000785665746f50726f706f73616c50726f706f73616c506172616d65746572738509b4403800000000000064000000640000006400000064000000011068761b959700000000000000000000010000000098557064617465476c6f62616c4e66744c696d697450726f706f73616c506172616d65746572738509b480700000b00400004200000042000000640000006400000001680abf82280f000000000000000000000100000000985570646174654368616e6e656c5061796f75747350726f706f73616c506172616d65746572738509b4c0890100403800004200000064000000640000006400000001680abf82280f0000000000000000000001000000009046756e64696e675265717565737450726f706f73616c4d6178546f74616c416d6f756e741840a010a012d3eb0500000000000000000004c4204d6178696d756d20746f74616c20616d6f756e7420696e2066756e64696e6720726571756573742070726f706f73616c8446756e64696e675265717565737450726f706f73616c4d61784163636f756e747310101400000004d0204d6178206e756d626572206f66206163636f756e7473207065722066756e64696e6720726571756573742070726f706f73616ca45365744d617856616c696461746f72436f756e7450726f706f73616c4d617856616c696461746f7273101064000000041501204d617820616c6c6f776564206e756d626572206f662076616c696461746f727320696e20736574206d61782076616c696461746f7220636f756e742070726f706f73616c01ad092044466f72756d576f726b696e6747726f75700154496e7374616e636531576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e01690601510318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410104a38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d666f72756d0464205374616b696e672068616e646c6572206c6f636b2069642e01bd09214c53746f72616765576f726b696e6747726f75700154496e7374616e636532576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e016d0601750318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410105438000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d73746f72670464205374616b696e672068616e646c6572206c6f636b2069642e01c109224c436f6e74656e74576f726b696e6747726f75700154496e7374616e636533576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e017106017d0318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410105e38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d636f6e74740464205374616b696e672068616e646c6572206c6f636b2069642e01c509236c4f7065726174696f6e73576f726b696e6747726f7570416c7068610154496e7374616e636534576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e01750601850318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410107c38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d6f706572610464205374616b696e672068616e646c6572206c6f636b2069642e01c909243c417070576f726b696e6747726f75700154496e7374616e636535576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e017906018d0318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410107238000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d6170706c690464205374616b696e672068616e646c6572206c6f636b2069642e01cd0925584d656d62657273686970576f726b696e6747726f75700154496e7374616e636536576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e017d0601950318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410106838000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d6d656d62720464205374616b696e672068616e646c6572206c6f636b2069642e01d10926684f7065726174696f6e73576f726b696e6747726f7570426574610154496e7374616e636537576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e018106019d0318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410108638000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d6f706572620464205374616b696e672068616e646c6572206c6f636b2069642e01d509276c4f7065726174696f6e73576f726b696e6747726f757047616d6d610154496e7374616e636538576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e01850601a50318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410109038000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d6f706572670464205374616b696e672068616e646c6572206c6f636b2069642e01d9092860446973747269627574696f6e576f726b696e6747726f75700154496e7374616e636539576f726b696e6747726f757028344e6578744f70656e696e67496401002020000000000000000004ac204e657874206964656e7469666965722076616c756520666f72206e6577206a6f62206f70656e696e672e2c4f70656e696e67427949640101040220b109290101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000480204d617073206964656e74696669657220746f206a6f62206f70656e696e672e44416374697665576f726b6572436f756e740100101000000000046420436f756e74206f662061637469766520776f726b6572732e3c4170706c69636174696f6e427949640001040220b509040004c8204d617073206964656e74696669657220746f20776f726b6572206170706c69636174696f6e206f6e206f70656e696e672e444e6578744170706c69636174696f6e496401002020000000000000000004c8204e657874206964656e7469666965722076616c756520666f72206e657720776f726b6572206170706c69636174696f6e2e304e657874576f726b657249640100202000000000000000000488204e657874206964656e74696669657220666f722061206e657720776f726b65722e28576f726b6572427949640001040220b909040004a4204d617073206964656e74696669657220746f20636f72726573706f6e64696e6720776f726b65722e2c43757272656e744c656164000020040004502043757272656e742067726f7570206c6561642e18427564676574010018400000000000000000000000000000000004782042756467657420666f722074686520776f726b696e672067726f75702e385374617475735465787448617368010024800000000000000000000000000000000000000000000000000000000000000000044820537461747573207465787420686173682e01890601ad0318504d6178576f726b65724e756d6265724c696d697410101e0000000838204578706f72747320636f6e73749c204d61782073696d756c74616e656f75732061637469766520776f726b6572206e756d6265722e5c4d696e556e7374616b696e67506572696f644c696d697410100065040004ac20446566696e6573206d696e20756e7374616b696e6720706572696f6420696e207468652067726f75702e5c4d696e696d756d4170706c69636174696f6e5374616b6518404835261a08030000000000000000000004d4204d696e696d756d207374616b6520726571756972656420666f72206170706c79696e6720696e746f20616e206f70656e696e672e484c65616465724f70656e696e675374616b651840680abf82280f00000000000000000000048c205374616b65206e656564656420746f2063726561746520616e206f70656e696e672e30526577617264506572696f6410109a38000004d420446566696e65732074686520706572696f6420657665727920776f726b65722067657473207061696420696e20626c6f636b732e505374616b696e6748616e646c65724c6f636b496405042077672d64697374720464205374616b696e672068616e646c6572206c6f636b2069642e01dd0929e109042048436865636b4e6f6e5a65726f53656e646572f5097440436865636b5370656356657273696f6ef9091038436865636b547856657273696f6efd091030436865636b47656e65736973010a2438436865636b4d6f7274616c697479050a2428436865636b4e6f6e63650d0a742c436865636b576569676874110a74604368617267655472616e73616374696f6e5061796d656e74150a74190a","id":"1"} \ No newline at end of file diff --git a/cli/.eslintrc.js b/cli/.eslintrc.js index ddb1139be2..c8b4bf38c8 100644 --- a/cli/.eslintrc.js +++ b/cli/.eslintrc.js @@ -3,7 +3,7 @@ module.exports = { mocha: true, }, parserOptions: { - project: './tsconfig.json' + project: './tsconfig.json', }, extends: [ // The oclif rules have some code-style/formatting rules which may conflict with diff --git a/cli/README.md b/cli/README.md index 39d91939e5..bccde04325 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,5 +1,4 @@ -@joystream/cli -============= +# @joystream/cli Command Line Interface for Joystream community and governance activities @@ -9,6 +8,7 @@ Command Line Interface for Joystream community and governance activities [![License](https://img.shields.io/npm/l/@joystream/cli.svg)](https://github.com/Joystream/joystream/blob/master/cli/package.json) +* [@joystream/cli](#joystreamcli) * [Usage](#usage) * [Development](#development) * [First steps](#first-steps) @@ -17,13 +17,14 @@ Command Line Interface for Joystream community and governance activities # Usage + ```sh-session $ npm install -g @joystream/cli $ joystream-cli COMMAND running command... $ joystream-cli (-v|--version|version) -@joystream/cli/0.7.0 darwin-x64 node-v14.16.1 +@joystream/cli/0.10.0 darwin-x64 node-v14.16.1 $ joystream-cli --help [COMMAND] USAGE $ joystream-cli COMMAND @@ -32,7 +33,9 @@ USAGE # Development + + To run a command in developemnt environment (from the root of [Joystream monorepo](https://github.com/Joystream/joystream), without installing the package): ```shell @@ -47,28 +50,33 @@ Alternatively: $ yarn workspace @joystream/cli link $ joystream-cli COMMAND ``` - + # First steps + + When using the CLI for the first time there are a few common steps you might want to take in order to configure the CLI: 1. Set the correct Joystream node websocket endpoint. You can do this by executing [`api:setUri`](#joystream-cli-apiseturi-uri) and choosing one of the suggested endpoints of providing your own url. To verify the currently used Joystream node websocket endpoint you can execute [`api:getUri`](#joystream-cli-apigeturi). 2. Set the Joystream query node endpoint. This is optional, but some commands (for example: [`content:createChannel`](#joystream-cli-contentcreatechannel)) will require a connection to the query node in order to fetch the data they need complete the requested operations (ie. [`content:createChannel`](#joystream-cli-contentcreatechannel) will need to fetch the available storage node endnpoints in order to upload the channel assets). In order to do that, execute [`api:setQueryNodeEndpoint`](#joystream-cli-apisetquerynodeendpoint-endpoint) and choose one of the suggested endpoints or provide your own url. You can use [`api:getQueryNodeEndpoint`](#joystream-cli-apigetquerynodeendpoint) any time to verify the currently set endpoint. 3. In order to use your existing keys within the CLI, you can import them using [`account:import`](#joystream-cli-accountimport) command. You can provide json backup files exported from Pioneer or Polkadot{.js} extension as an input. You can also use raw mnemonic or seed phrases. See the [`account:import` command documentation](#joystream-cli-accountimport) for the full list of supported inputs. - The key to sign the transaction(s) with will be determined based on the required permissions, depending on the command you execute. For example, if you execute [`working-groups:updateRewardAccount --group storageProviders`](#joystream-cli-working-groupsupdaterewardaccount-address), the CLI will look for a storage provider role key among your available keys. If multiple execution contexts are available, the CLI will prompt you to choose the desired one. + The key to sign the transaction(s) with will be determined based on the required permissions, depending on the command you execute. For example, if you execute [`working-groups:updateRewardAccount --group storageProviders`](#joystream-cli-working-groupsupdaterewardaccount-address), the CLI will look for a storage provider role key among your available keys. If multiple execution contexts are available, the CLI will prompt you to choose the desired one. 4. **Optionally:** You may also find it useful to get the first part of the command (before the colon) autocompleted when you press `[Tab]` while typing the command name in the console. Executing [`autocomplete`](#joystream-cli-autocomplete-shell) command will provide you the instructions on how to set this up. 5. That's it! The CLI is now be fully set up! Feel free to use the `--help` flag to investigate the available commands or take a look at the commands documentation below. # Useful environment settings + + - `FORCE_COLOR=0` - disables output coloring. This will make the output easier to parse in case it's redirected to a file or used within a script. - `AUTO_CONFIRM=true` - this will make the CLI skip asking for any confirmations (can be useful when creating bash scripts). # Commands + * [`joystream-cli account:create`](#joystream-cli-accountcreate) * [`joystream-cli account:export DESTPATH`](#joystream-cli-accountexport-destpath) @@ -77,6 +85,13 @@ When using the CLI for the first time there are a few common steps you might wan * [`joystream-cli account:info [ADDRESS]`](#joystream-cli-accountinfo-address) * [`joystream-cli account:list`](#joystream-cli-accountlist) * [`joystream-cli account:transferTokens`](#joystream-cli-accounttransfertokens) +* [`joystream-cli advanced-transactions:constructSetCodeCall`](#joystream-cli-advanced-transactionsconstructsetcodecall) +* [`joystream-cli advanced-transactions:constructTxCall`](#joystream-cli-advanced-transactionsconstructtxcall) +* [`joystream-cli advanced-transactions:constructUnsignedTx`](#joystream-cli-advanced-transactionsconstructunsignedtx) +* [`joystream-cli advanced-transactions:constructUnsignedTxApproveMs`](#joystream-cli-advanced-transactionsconstructunsignedtxapprovems) +* [`joystream-cli advanced-transactions:constructUnsignedTxFinalApproveMs`](#joystream-cli-advanced-transactionsconstructunsignedtxfinalapprovems) +* [`joystream-cli advanced-transactions:constructUnsignedTxInitiateMs`](#joystream-cli-advanced-transactionsconstructunsignedtxinitiatems) +* [`joystream-cli advanced-transactions:constructWrappedTxCall`](#joystream-cli-advanced-transactionsconstructwrappedtxcall) * [`joystream-cli api:getQueryNodeEndpoint`](#joystream-cli-apigetquerynodeendpoint) * [`joystream-cli api:getUri`](#joystream-cli-apigeturi) * [`joystream-cli api:inspect`](#joystream-cli-apiinspect) @@ -87,30 +102,43 @@ When using the CLI for the first time there are a few common steps you might wan * [`joystream-cli content:channel CHANNELID`](#joystream-cli-contentchannel-channelid) * [`joystream-cli content:channels`](#joystream-cli-contentchannels) * [`joystream-cli content:createChannel`](#joystream-cli-contentcreatechannel) -* [`joystream-cli content:createChannelCategory`](#joystream-cli-contentcreatechannelcategory) * [`joystream-cli content:createCuratorGroup`](#joystream-cli-contentcreatecuratorgroup) +* [`joystream-cli content:createPlaylist`](#joystream-cli-contentcreateplaylist) * [`joystream-cli content:createVideo`](#joystream-cli-contentcreatevideo) -* [`joystream-cli content:createVideoCategory`](#joystream-cli-contentcreatevideocategory) +* [`joystream-cli content:createVideoCategory NAME [DESCRIPTION] [PARENTCATEGORYID]`](#joystream-cli-contentcreatevideocategory-name-description-parentcategoryid) * [`joystream-cli content:curatorGroup ID`](#joystream-cli-contentcuratorgroup-id) * [`joystream-cli content:curatorGroups`](#joystream-cli-contentcuratorgroups) * [`joystream-cli content:deleteChannel`](#joystream-cli-contentdeletechannel) -* [`joystream-cli content:deleteChannelCategory CHANNELCATEGORYID`](#joystream-cli-contentdeletechannelcategory-channelcategoryid) +* [`joystream-cli content:deleteChannelAsModerator`](#joystream-cli-contentdeletechannelasmoderator) +* [`joystream-cli content:deleteChannelAssetsAsModerator`](#joystream-cli-contentdeletechannelassetsasmoderator) +* [`joystream-cli content:deletePlaylist`](#joystream-cli-contentdeleteplaylist) * [`joystream-cli content:deleteVideo`](#joystream-cli-contentdeletevideo) -* [`joystream-cli content:deleteVideoCategory VIDEOCATEGORYID`](#joystream-cli-contentdeletevideocategory-videocategoryid) +* [`joystream-cli content:deleteVideoAsModerator`](#joystream-cli-contentdeletevideoasmoderator) +* [`joystream-cli content:deleteVideoAssetsAsModerator`](#joystream-cli-contentdeletevideoassetsasmoderator) * [`joystream-cli content:removeChannelAssets`](#joystream-cli-contentremovechannelassets) * [`joystream-cli content:removeCuratorFromGroup [GROUPID] [CURATORID]`](#joystream-cli-contentremovecuratorfromgroup-groupid-curatorid) * [`joystream-cli content:reuploadAssets`](#joystream-cli-contentreuploadassets) +* [`joystream-cli content:setChannelVisibilityAsModerator`](#joystream-cli-contentsetchannelvisibilityasmoderator) * [`joystream-cli content:setCuratorGroupStatus [ID] [STATUS]`](#joystream-cli-contentsetcuratorgroupstatus-id-status) -* [`joystream-cli content:setFeaturedVideos FEATUREDVIDEOIDS`](#joystream-cli-contentsetfeaturedvideos-featuredvideoids) +* [`joystream-cli content:setVideoVisibilityAsModerator`](#joystream-cli-contentsetvideovisibilityasmoderator) * [`joystream-cli content:updateChannel CHANNELID`](#joystream-cli-contentupdatechannel-channelid) -* [`joystream-cli content:updateChannelCategory CHANNELCATEGORYID`](#joystream-cli-contentupdatechannelcategory-channelcategoryid) -* [`joystream-cli content:updateChannelCensorshipStatus ID [STATUS]`](#joystream-cli-contentupdatechannelcensorshipstatus-id-status) -* [`joystream-cli content:updateChannelModerators`](#joystream-cli-contentupdatechannelmoderators) +* [`joystream-cli content:updateChannelStateBloatBond VALUE`](#joystream-cli-contentupdatechannelstatebloatbond-value) +* [`joystream-cli content:updateCuratorGroupPermissions [ID]`](#joystream-cli-contentupdatecuratorgrouppermissions-id) +* [`joystream-cli content:updatePlaylist PLAYLISTID`](#joystream-cli-contentupdateplaylist-playlistid) * [`joystream-cli content:updateVideo VIDEOID`](#joystream-cli-contentupdatevideo-videoid) -* [`joystream-cli content:updateVideoCategory VIDEOCATEGORYID`](#joystream-cli-contentupdatevideocategory-videocategoryid) -* [`joystream-cli content:updateVideoCensorshipStatus ID [STATUS]`](#joystream-cli-contentupdatevideocensorshipstatus-id-status) +* [`joystream-cli content:updateVideoStateBloatBond VALUE`](#joystream-cli-contentupdatevideostatebloatbond-value) * [`joystream-cli content:video VIDEOID`](#joystream-cli-contentvideo-videoid) * [`joystream-cli content:videos [CHANNELID]`](#joystream-cli-contentvideos-channelid) +* [`joystream-cli fee-profile:addForumPost`](#joystream-cli-fee-profileaddforumpost) +* [`joystream-cli fee-profile:addVideoComment`](#joystream-cli-fee-profileaddvideocomment) +* [`joystream-cli fee-profile:buyMembership`](#joystream-cli-fee-profilebuymembership) +* [`joystream-cli fee-profile:createChannel`](#joystream-cli-fee-profilecreatechannel) +* [`joystream-cli fee-profile:createForumThread`](#joystream-cli-fee-profilecreateforumthread) +* [`joystream-cli fee-profile:createVideo`](#joystream-cli-fee-profilecreatevideo) +* [`joystream-cli fee-profile:deleteChannel`](#joystream-cli-fee-profiledeletechannel) +* [`joystream-cli fee-profile:deleteForumPost`](#joystream-cli-fee-profiledeleteforumpost) +* [`joystream-cli fee-profile:deleteForumThread`](#joystream-cli-fee-profiledeleteforumthread) +* [`joystream-cli fee-profile:deleteVideo`](#joystream-cli-fee-profiledeletevideo) * [`joystream-cli forum:addPost`](#joystream-cli-forumaddpost) * [`joystream-cli forum:categories`](#joystream-cli-forumcategories) * [`joystream-cli forum:category`](#joystream-cli-forumcategory) @@ -129,8 +157,10 @@ When using the CLI for the first time there are a few common steps you might wan * [`joystream-cli membership:addStakingAccount`](#joystream-cli-membershipaddstakingaccount) * [`joystream-cli membership:buy`](#joystream-cli-membershipbuy) * [`joystream-cli membership:details`](#joystream-cli-membershipdetails) +* [`joystream-cli membership:memberRemark MESSAGE`](#joystream-cli-membershipmemberremark-message) * [`joystream-cli membership:update`](#joystream-cli-membershipupdate) * [`joystream-cli membership:updateAccounts`](#joystream-cli-membershipupdateaccounts) +* [`joystream-cli sign-offline:signUnsignedTx`](#joystream-cli-sign-offlinesignunsignedtx) * [`joystream-cli staking:validate`](#joystream-cli-stakingvalidate) * [`joystream-cli working-groups:application WGAPPLICATIONID`](#joystream-cli-working-groupsapplication-wgapplicationid) * [`joystream-cli working-groups:apply`](#joystream-cli-working-groupsapply) @@ -150,7 +180,6 @@ When using the CLI for the first time there are a few common steps you might wan * [`joystream-cli working-groups:updateGroupMetadata`](#joystream-cli-working-groupsupdategroupmetadata) * [`joystream-cli working-groups:updateRewardAccount [ADDRESS]`](#joystream-cli-working-groupsupdaterewardaccount-address) * [`joystream-cli working-groups:updateRoleAccount [ADDRESS]`](#joystream-cli-working-groupsupdateroleaccount-address) -* [`joystream-cli working-groups:updateRoleStorage STORAGE`](#joystream-cli-working-groupsupdaterolestorage-storage) * [`joystream-cli working-groups:updateWorkerReward WORKERID NEWREWARD`](#joystream-cli-working-groupsupdateworkerreward-workerid-newreward) ## `joystream-cli account:create` @@ -265,6 +294,257 @@ OPTIONS _See code: [src/commands/account/transferTokens.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/account/transferTokens.ts)_ +## `joystream-cli advanced-transactions:constructSetCodeCall` + +Construct a "system.setCode" call. + +``` +USAGE + $ joystream-cli advanced-transactions:constructSetCodeCall + +OPTIONS + -o, --output=output (required) Path to the file where the call should be saved + --address=address (required) The address that is performing the final call. + --codeOutput=codeOutput Path to where the parsed wasm code shold be saved. + + --lifetime=lifetime [default: 64] Lifetime of the transaction, from creation to included on chain, in + blocks before it becomes invalid. + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. + + --wasmPath=wasmPath (required) The address that is performing the final call. +``` + +_See code: [src/commands/advanced-transactions/constructSetCodeCall.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructSetCodeCall.ts)_ + +## `joystream-cli advanced-transactions:constructTxCall` + +Construct a call that as argument for a transaction, or to wrap in another call. + +``` +USAGE + $ joystream-cli advanced-transactions:constructTxCall + +OPTIONS + -o, --output=output (required) Path to the file where the output JSON should be saved. + --address=address (required) The address that is performing the (final) transaction. + + --lifetime=lifetime [default: 64] Lifetime of the transaction, from creation to included on chain, in + blocks before it becomes invalid. + + --method=method (required) The method of the extrinsic + + --module=module (required) The module (a.k.a. section) of the extrinsic + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructTxCall.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructTxCall.ts)_ + +## `joystream-cli advanced-transactions:constructUnsignedTx` + +Create a simple unsigned transaction, for signing offline. + +``` +USAGE + $ joystream-cli advanced-transactions:constructUnsignedTx + +OPTIONS + -o, --output=output (required) Path to the file where the output JSON should be saved. + --address=address (required) The address that is performing the transaction. + + --lifetime=lifetime Lifetime of the transaction, from constructed to included in a block, in blocks + before it becomes invalid. Must be a power of two between 4 and 65536 + + --method=method (required) The method of the extrinsic + + --module=module (required) The module of the extrinsic + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructUnsignedTx.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructUnsignedTx.ts)_ + +## `joystream-cli advanced-transactions:constructUnsignedTxApproveMs` + +Approve a transaction from a multisig account, as initiated by another signer. + +``` +USAGE + $ joystream-cli advanced-transactions:constructUnsignedTxApproveMs + +OPTIONS + -i, --input=input Path to JSON file to use as input (if not specified - the input can be provided + interactively) + + -o, --output=output (required) Path to the file where the output JSON should be saved. + + --addressMs=addressMs The address of the multisig that is performing the transaction. + + --addressSigner=addressSigner (required) The address of the signer that is approving the multisig transaction. + + --inputCall=inputCall The hex-encoded call that is to be executed by the multisig if successfull. + + --inputCallFile=inputCallFile Path to a JSON file with the hex-encoded call that is to be executed by the + multisig if successfull. + + --lifetime=lifetime Lifetime of the transaction, from constructed to included in a block, in blocks + before it becomes invalid. Must be a power of two between 4 and 65536 + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --others=others Comma separated list of the accounts (other than the addressSigner) who can approve + this call. Ignored if "input" is provided. + + --threshold=threshold How many (m) of the n signatories (signer+others), are required to sign/approve the + transaction. Ignored if "input" is provided. + + --timepointHeight=timepointHeight Reference to the blockheight of the transaction that initiated the multisig + transaction. Ignored if "input" is provided. + + --timepointIndex=timepointIndex Reference to the extrinsic index in the "timepointHeight block. Ignored if "input" + is provided. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructUnsignedTxApproveMs.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructUnsignedTxApproveMs.ts)_ + +## `joystream-cli advanced-transactions:constructUnsignedTxFinalApproveMs` + +Final approval of a transaction from a multisig account, as initiated by another signer. + +``` +USAGE + $ joystream-cli advanced-transactions:constructUnsignedTxFinalApproveMs + +OPTIONS + -i, --input=input Path to JSON file to use as input (if not specified - the input can be provided + interactively) + + -o, --output=output (required) Path to the file where the output JSON should be saved. + + --addressMs=addressMs The address of the multisig that is performing the transaction. + + --addressSigner=addressSigner (required) The address of the signer that is approving the multisig transaction. + + --inputCall=inputCall The hex-encoded call that is to be executed by the multisig if successfull. + + --inputCallFile=inputCallFile Path to a JSON file with the hex-encoded call that is to be executed by the + multisig if successfull. + + --lifetime=lifetime Lifetime of the transaction, from constructed to included in a block, in blocks + before it becomes invalid. Must be a power of two between 4 and 65536 + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --others=others Comma separated list of the accounts (other than the addressSigner) who can approve + this call. Ignored if "input" is provided. + + --threshold=threshold How many (m) of the n signatories (signer+others), are required to sign/approve the + transaction. Ignored if "input" is provided. + + --timepointHeight=timepointHeight Reference to the blockheight of the transaction that initiated the multisig + transaction. Ignored if "input" is provided. + + --timepointIndex=timepointIndex Reference to the extrinsic index in the "timepointHeight block. Ignored if "input" + is provided. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructUnsignedTxFinalApproveMs.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructUnsignedTxFinalApproveMs.ts)_ + +## `joystream-cli advanced-transactions:constructUnsignedTxInitiateMs` + +Initiate a call (transaction) from a multisig account, as the first signer. + +``` +USAGE + $ joystream-cli advanced-transactions:constructUnsignedTxInitiateMs + +OPTIONS + -i, --input=input Path to JSON file to use as input (if not specified - the input can be provided + interactively) + + -o, --output=output (required) Path to the file where the output JSON should be saved. + + --addressMs=addressMs The address of the multisig that is performing the transaction. + + --addressSigner=addressSigner (required) The address of the signer that is initiating the multisig transaction. + + --inputCall=inputCall The hex-encoded call that is to be executed by the multisig if successfull. + + --inputCallFile=inputCallFile Path to a JSON file with the hex-encoded call that is to be executed by the multisig + if successfull. + + --lifetime=lifetime Lifetime of the transaction, from constructed to included in a block, in blocks + before it becomes invalid. Must be a power of two between 4 and 65536 + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --others=others Comma separated list of the accounts (other than the addressSigner) who can approve + this call. Ignored if "input" is provided. + + --threshold=threshold How many (m) of the n signatories (signer+others), are required to sign/approve the + transaction. Ignored if "input" is provided. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructUnsignedTxInitiateMs.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructUnsignedTxInitiateMs.ts)_ + +## `joystream-cli advanced-transactions:constructWrappedTxCall` + +Construct a wrapped transaction call. + +``` +USAGE + $ joystream-cli advanced-transactions:constructWrappedTxCall + +OPTIONS + -o, --output=output (required) Path to the file where the output JSON should be saved. + --address=address (required) The address that is performing the (final) transaction. + --fullOutput=fullOutput Path to the file where the full output should be saved + --inputCall=inputCall The hex-encoded call that is to be executed by the multisig if successfull. + + --inputCallFile=inputCallFile Path to a JSON file with the hex-encoded call that is to be executed by the multisig + if successfull. + + --lifetime=lifetime [default: 64] Lifetime of the transaction, from creation to included on chain, in + blocks before it becomes invalid. + + --method=method (required) The method of the extrinsic + + --module=module (required) The module (a.k.a. section) of the extrinsic + + --nonceIncrement=nonceIncrement [default: 0] If you are preparing multiple transactions from the samme account, + before broadcasting them, you need to increase the nonce by 1 for each. This value + will be added to the nonce read from the chain. + + --tip=tip [default: 0] Optional "tip" (in base value) for faster block inclusion. +``` + +_See code: [src/commands/advanced-transactions/constructWrappedTxCall.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/advanced-transactions/constructWrappedTxCall.ts)_ + ## `joystream-cli api:getQueryNodeEndpoint` Get current query node endpoint @@ -301,15 +581,15 @@ OPTIONS If no "--method" flag is provided then all methods in that module will be listed along with the descriptions. -a, --callArgs=callArgs - Specifies the arguments to use when calling a method. Multiple arguments can be separated with a comma, ie. + Specifies the arguments to use when calling a method. Multiple arguments can be separated with a comma, ie. "-a=arg1,arg2". You can omit this flag even if the method requires some aguments. In that case you will be promted to provide value for each required argument. - Ommiting this flag is recommended when input parameters are of more complex types (and it's hard to specify them as + Ommiting this flag is recommended when input parameters are of more complex types (and it's hard to specify them as just simple comma-separated strings) -e, --exec - Provide this flag if you want to execute the actual call, instead of displaying the method description (which is + Provide this flag if you want to execute the actual call, instead of displaying the method description (which is default) -m, --method=method @@ -395,8 +675,17 @@ ARGUMENTS CURATORID ID of the curator OPTIONS - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -p, --permissions=UpdateChannelMetadata|ManageNonVideoChannelAssets|ManageChannelCollaborators|UpdateVideoMetadata|Add + Video|ManageVideoAssets|DeleteChannel|DeleteVideo|ManageVideoNfts|AgentRemark|TransferChannel|ClaimChannelReward|Withd + rawFromChannelBalance|IssueCreatorToken|ClaimCreatorTokenPatronage|InitAndManageCreatorTokenSale|CreatorTokenIssuerTra + nsfer|MakeCreatorTokenPermissionless|ReduceCreatorTokenPatronageRate|ManageRevenueSplits|DeissueCreatorToken + List of permissions to associate with the curator, e.g. -p ManageChannelCollaborators UpdateVideoMetadata + + --useMemberId=useMemberId + Try using the specified member id as context whenever possible + + --useWorkerId=useWorkerId + Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/addCuratorToGroup.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/addCuratorToGroup.ts)_ @@ -443,78 +732,85 @@ USAGE $ joystream-cli content:createChannel OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Member|Curator) Actor context to execute the command in (Member/Curator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -i, --input=input (required) Path to JSON file to use as input + --context=(Member|CuratorGroup) Actor context to execute the command in (Member/CuratorGroup) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/createChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createChannel.ts)_ -## `joystream-cli content:createChannelCategory` +## `joystream-cli content:createCuratorGroup` -Create channel category inside content directory. +Create new Curator Group. ``` USAGE - $ joystream-cli content:createChannelCategory + $ joystream-cli content:createCuratorGroup OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -p, --permissions=permissions Path to JSON file containing moderation permissions by channel privilege level to use + as input + + --status=(ACTIVE|INACTIVE) (required) Status of newly created Curator Group: (ACTIVE/INACTIVE) + + --useMemberId=useMemberId Try using the specified member id as context whenever possible + + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/createChannelCategory.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createChannelCategory.ts)_ +_See code: [src/commands/content/createCuratorGroup.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createCuratorGroup.ts)_ -## `joystream-cli content:createCuratorGroup` +## `joystream-cli content:createPlaylist` -Create new Curator Group. +Create playlist under specific channel inside content directory. ``` USAGE - $ joystream-cli content:createCuratorGroup + $ joystream-cli content:createPlaylist OPTIONS - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible - -ALIASES - $ joystream-cli createCuratorGroup + -c, --channelId=channelId (required) ID of the Channel + -i, --input=input (required) Path to JSON file to use as input + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/createCuratorGroup.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createCuratorGroup.ts)_ +_See code: [src/commands/content/createPlaylist.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createPlaylist.ts)_ ## `joystream-cli content:createVideo` -Create video under specific channel inside content directory. +Create video (non nft) under specific channel inside content directory. ``` USAGE $ joystream-cli content:createVideo OPTIONS - -c, --channelId=channelId (required) ID of the Channel - -i, --input=input (required) Path to JSON file to use as input - --context=(Owner|Collaborator) Actor context to execute the command in (Owner/Collaborator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -c, --channelId=channelId (required) ID of the Channel + -i, --input=input (required) Path to JSON file to use as input + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/createVideo.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/createVideo.ts)_ -## `joystream-cli content:createVideoCategory` +## `joystream-cli content:createVideoCategory NAME [DESCRIPTION] [PARENTCATEGORYID]` Create video category inside content directory. ``` USAGE - $ joystream-cli content:createVideoCategory + $ joystream-cli content:createVideoCategory NAME [DESCRIPTION] [PARENTCATEGORYID] + +ARGUMENTS + NAME Video category name + DESCRIPTION Video category description + PARENTCATEGORYID Parent category ID OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` @@ -562,33 +858,71 @@ Delete the channel and optionally all associated data objects. USAGE $ joystream-cli content:deleteChannel +OPTIONS + -c, --channelId=channelId (required) ID of the Channel + -f, --force Force-remove all associated channel data objects + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible +``` + +_See code: [src/commands/content/deleteChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteChannel.ts)_ + +## `joystream-cli content:deleteChannelAsModerator` + +Delete the channel and optionally all associated data objects. + +``` +USAGE + $ joystream-cli content:deleteChannelAsModerator + OPTIONS -c, --channelId=channelId (required) ID of the Channel -f, --force Force-remove all associated channel data objects + -r, --rationale=rationale (required) Reason of deleting the channel by moderator + --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/deleteChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteChannel.ts)_ +_See code: [src/commands/content/deleteChannelAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteChannelAsModerator.ts)_ -## `joystream-cli content:deleteChannelCategory CHANNELCATEGORYID` +## `joystream-cli content:deleteChannelAssetsAsModerator` -Delete channel category. +Delete the channel assets. ``` USAGE - $ joystream-cli content:deleteChannelCategory CHANNELCATEGORYID - -ARGUMENTS - CHANNELCATEGORYID ID of the Channel Category + $ joystream-cli content:deleteChannelAssetsAsModerator OPTIONS + -a, --assetIds=assetIds (required) List of data object IDs to delete + -c, --channelId=channelId (required) ID of the Channel + -r, --rationale=rationale (required) Reason for removing the channel assets by moderator --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/deleteChannelCategory.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteChannelCategory.ts)_ +_See code: [src/commands/content/deleteChannelAssetsAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteChannelAssetsAsModerator.ts)_ + +## `joystream-cli content:deletePlaylist` + +Delete the playlist and optionally all associated data objects. + +``` +USAGE + $ joystream-cli content:deletePlaylist + +OPTIONS + -f, --force Force-remove all associated playlist data objects + -p, --playlistId=playlistId (required) ID of the Playlist + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible +``` + +_See code: [src/commands/content/deletePlaylist.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deletePlaylist.ts)_ ## `joystream-cli content:deleteVideo` @@ -599,33 +933,52 @@ USAGE $ joystream-cli content:deleteVideo OPTIONS - -f, --force Force-remove all associated video data objects - -v, --videoId=videoId (required) ID of the Video - --context=(Owner|Collaborator) Actor context to execute the command in (Owner/Collaborator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -f, --force Force-remove all associated video data objects + -v, --videoId=videoId (required) ID of the Video + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/deleteVideo.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteVideo.ts)_ -## `joystream-cli content:deleteVideoCategory VIDEOCATEGORYID` +## `joystream-cli content:deleteVideoAsModerator` -Delete video category. +Delete the video and optionally all associated data objects. ``` USAGE - $ joystream-cli content:deleteVideoCategory VIDEOCATEGORYID + $ joystream-cli content:deleteVideoAsModerator -ARGUMENTS - VIDEOCATEGORYID ID of the Video Category +OPTIONS + -f, --force Force-remove all associated video data objects + -r, --rationale=rationale (required) reason of deleting the video by moderator + -v, --videoId=videoId (required) ID of the Video + --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible +``` + +_See code: [src/commands/content/deleteVideoAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteVideoAsModerator.ts)_ + +## `joystream-cli content:deleteVideoAssetsAsModerator` + +Delete the video assets. + +``` +USAGE + $ joystream-cli content:deleteVideoAssetsAsModerator OPTIONS + -a, --assetIds=assetIds (required) List of data object IDs to delete + -r, --rationale=rationale (required) Reason for removing the video assets by moderator + -v, --videoId=videoId (required) ID of the Video --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/deleteVideoCategory.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteVideoCategory.ts)_ +_See code: [src/commands/content/deleteVideoAssetsAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/deleteVideoAssetsAsModerator.ts)_ ## `joystream-cli content:removeChannelAssets` @@ -636,11 +989,11 @@ USAGE $ joystream-cli content:removeChannelAssets OPTIONS - -c, --channelId=channelId (required) ID of the Channel - -o, --objectId=objectId (required) ID of an object to remove - --context=(Owner|Collaborator) Actor context to execute the command in (Owner/Collaborator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -c, --channelId=channelId (required) ID of the Channel + -o, --objectId=objectId (required) ID of an object to remove + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/removeChannelAssets.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/removeChannelAssets.ts)_ @@ -680,6 +1033,25 @@ OPTIONS _See code: [src/commands/content/reuploadAssets.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/reuploadAssets.ts)_ +## `joystream-cli content:setChannelVisibilityAsModerator` + +Set channel visibility as moderator. + +``` +USAGE + $ joystream-cli content:setChannelVisibilityAsModerator + +OPTIONS + -c, --channelId=channelId (required) ID of the channel + -r, --rationale=rationale (required) Reason for changing visibility of channel + -s, --status=(VISIBLE|HIDDEN) (required) The visibility status of the channel + --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible +``` + +_See code: [src/commands/content/setChannelVisibilityAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/setChannelVisibilityAsModerator.ts)_ + ## `joystream-cli content:setCuratorGroupStatus [ID] [STATUS]` Set Curator Group status (Active/Inactive). @@ -699,23 +1071,24 @@ OPTIONS _See code: [src/commands/content/setCuratorGroupStatus.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/setCuratorGroupStatus.ts)_ -## `joystream-cli content:setFeaturedVideos FEATUREDVIDEOIDS` +## `joystream-cli content:setVideoVisibilityAsModerator` -Set featured videos. Requires lead access. +Set video visibility as moderator. ``` USAGE - $ joystream-cli content:setFeaturedVideos FEATUREDVIDEOIDS - -ARGUMENTS - FEATUREDVIDEOIDS Comma-separated video IDs (ie. 1,2,3) + $ joystream-cli content:setVideoVisibilityAsModerator OPTIONS - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -r, --rationale=rationale (required) Reason for changing visibility of video + -s, --status=(VISIBLE|HIDDEN) (required) The visibility status of the video + -v, --videoId=videoId (required) ID of the Video + --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/setFeaturedVideos.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/setFeaturedVideos.ts)_ +_See code: [src/commands/content/setVideoVisibilityAsModerator.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/setVideoVisibilityAsModerator.ts)_ ## `joystream-cli content:updateChannel CHANNELID` @@ -729,73 +1102,73 @@ ARGUMENTS CHANNELID ID of the Channel OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Owner|Collaborator) Actor context to execute the command in (Owner/Collaborator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -i, --input=input (required) Path to JSON file to use as input + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/updateChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateChannel.ts)_ -## `joystream-cli content:updateChannelCategory CHANNELCATEGORYID` +## `joystream-cli content:updateChannelStateBloatBond VALUE` -Update channel category inside content directory. +Update channel state bloat bond. ``` USAGE - $ joystream-cli content:updateChannelCategory CHANNELCATEGORYID + $ joystream-cli content:updateChannelStateBloatBond VALUE ARGUMENTS - CHANNELCATEGORYID ID of the Channel Category + VALUE New state bloat bond value OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/updateChannelCategory.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateChannelCategory.ts)_ +_See code: [src/commands/content/updateChannelStateBloatBond.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateChannelStateBloatBond.ts)_ -## `joystream-cli content:updateChannelCensorshipStatus ID [STATUS]` +## `joystream-cli content:updateCuratorGroupPermissions [ID]` -Update Channel censorship status (Censored / Not censored). +Update existing Curator Group. ``` USAGE - $ joystream-cli content:updateChannelCensorshipStatus ID [STATUS] + $ joystream-cli content:updateCuratorGroupPermissions [ID] ARGUMENTS - ID ID of the Channel - STATUS New censorship status of the channel (1 - censored, 0 - not censored) + ID ID of the Curator Group OPTIONS - --rationale=rationale rationale - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -p, --permissions=permissions (required) Path to JSON file containing moderation permissions by channel privilege + level to use as input + + --useMemberId=useMemberId Try using the specified member id as context whenever possible + + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/updateChannelCensorshipStatus.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateChannelCensorshipStatus.ts)_ +_See code: [src/commands/content/updateCuratorGroupPermissions.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateCuratorGroupPermissions.ts)_ -## `joystream-cli content:updateChannelModerators` +## `joystream-cli content:updatePlaylist PLAYLISTID` -Update Channel's moderator set. +Update playlist under specific id. ``` USAGE - $ joystream-cli content:updateChannelModerators + $ joystream-cli content:updatePlaylist PLAYLISTID -OPTIONS - -c, --channelId=channelId (required) Channel id - -m, --moderators=moderators New set of moderators - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible +ARGUMENTS + PLAYLISTID ID of the Playlist -EXAMPLE - $ content:updateChannelModerators -c 1 -m 1 2 3 +OPTIONS + -i, --input=input (required) Path to JSON file to use as input + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/updateChannelModerators.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateChannelModerators.ts)_ +_See code: [src/commands/content/updatePlaylist.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updatePlaylist.ts)_ ## `joystream-cli content:updateVideo VIDEOID` @@ -809,53 +1182,31 @@ ARGUMENTS VIDEOID ID of the Video OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Owner|Collaborator) Actor context to execute the command in (Owner/Collaborator) - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible + -i, --input=input (required) Path to JSON file to use as input + --context=(Owner|Curator|Collaborator) Actor context to execute the command in (Owner/Curator/Collaborator) + --useMemberId=useMemberId Try using the specified member id as context whenever possible + --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` _See code: [src/commands/content/updateVideo.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateVideo.ts)_ -## `joystream-cli content:updateVideoCategory VIDEOCATEGORYID` +## `joystream-cli content:updateVideoStateBloatBond VALUE` -Update video category inside content directory. +Update video state bloat bond. ``` USAGE - $ joystream-cli content:updateVideoCategory VIDEOCATEGORYID + $ joystream-cli content:updateVideoStateBloatBond VALUE ARGUMENTS - VIDEOCATEGORYID ID of the Video Category + VALUE New state bloat bond value OPTIONS - -i, --input=input (required) Path to JSON file to use as input - --context=(Lead|Curator) Actor context to execute the command in (Lead/Curator) --useMemberId=useMemberId Try using the specified member id as context whenever possible --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible ``` -_See code: [src/commands/content/updateVideoCategory.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateVideoCategory.ts)_ - -## `joystream-cli content:updateVideoCensorshipStatus ID [STATUS]` - -Update Video censorship status (Censored / Not censored). - -``` -USAGE - $ joystream-cli content:updateVideoCensorshipStatus ID [STATUS] - -ARGUMENTS - ID ID of the Video - STATUS New video censorship status (1 - censored, 0 - not censored) - -OPTIONS - --rationale=rationale rationale - --useMemberId=useMemberId Try using the specified member id as context whenever possible - --useWorkerId=useWorkerId Try using the specified worker id as context whenever possible -``` - -_See code: [src/commands/content/updateVideoCensorshipStatus.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateVideoCensorshipStatus.ts)_ +_See code: [src/commands/content/updateVideoStateBloatBond.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/updateVideoStateBloatBond.ts)_ ## `joystream-cli content:video VIDEOID` @@ -893,6 +1244,262 @@ OPTIONS _See code: [src/commands/content/videos.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/content/videos.ts)_ +## `joystream-cli fee-profile:addForumPost` + +Create fee profile of forum.add_post extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:addForumPost + +OPTIONS + -e, --editable If specified - `editable` parameter is set to true when estimating the costs + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + -p, --postLen=postLen [default: 200] Post length to use for estimating tx fee +``` + +_See code: [src/commands/fee-profile/addForumPost.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/addForumPost.ts)_ + +## `joystream-cli fee-profile:addVideoComment` + +Create fee profile of members.member_remark extrinsic (video comment case). + +``` +USAGE + $ joystream-cli fee-profile:addVideoComment + +OPTIONS + -c, --commentLen=commentLen [default: 50] Comment length to use for estimating tx fee + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD +``` + +_See code: [src/commands/fee-profile/addVideoComment.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/addVideoComment.ts)_ + +## `joystream-cli fee-profile:buyMembership` + +Create fee profile of members.buy_membership extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:buyMembership + +OPTIONS + -E, --externalResourcesCount=externalResourcesCount [default: 1] Number of external resources (part of metadata) to + use for estimating tx fee + + -a, --aboutLength=aboutLength [default: 0] Length of the member's about text (part of metadata) + to use for estimating tx fee + + -e, --externalResourceLength=externalResourceLength [default: 25] Length of a single external resource url (part of + metadata) to use for estimating tx fee + + -h, --handleLength=handleLength [default: 10] Length of the membership handle to use for + estimating tx fee + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + + -n, --nameLength=nameLength [default: 10] Length of the member's name (part of metadata) to + use for estimating tx fee + + -u, --avatarUriLength=avatarUriLength [default: 25] Length of the member's avatar uri (part of + metadata) to use for estimating tx fee +``` + +_See code: [src/commands/fee-profile/buyMembership.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/buyMembership.ts)_ + +## `joystream-cli fee-profile:createChannel` + +Create fee profile of content.create_channel extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:createChannel + +OPTIONS + -C, --collaboratorsNum=collaboratorsNum [default: 0] Number of channel collaborators to use for + estimating tx fee + + -D, --distributionBucketsNum=distributionBucketsNum Number of distribution buckets to use for estimating tx fee. + By default this number will be based on the current chain's + dynamic bag policy for channel bags + + -S, --storageBucketsNum=storageBucketsNum Number of storage buckets to use for estimating tx fee. + By default this number will be based on the current chain's + dynamic bag policy for channel bags + + -a, --avatarSize=avatarSize [default: 1] Avatar size in MB to use when estimating the costs + + -c, --coverSize=coverSize [default: 1] Cover photo size in MB to use when estimating the + costs + + -d, --descriptionLen=descriptionLen [default: 200] Channel description (part of channel metadata) + length to use for estimating tx fee + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + + -t, --titleLen=titleLen [default: 15] Channel title (part of channel metadata) length to + use for estimating tx fee + + --noAvatar If provided - channel with no avatar will be used for estimating + the costs + + --noCover If provided - channel with no cover photo will be used for + estimating the costs +``` + +_See code: [src/commands/fee-profile/createChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/createChannel.ts)_ + +## `joystream-cli fee-profile:createForumThread` + +Create fee profile of forum.create_thread extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:createForumThread + +OPTIONS + -G, --tagsNum=tagsNum [default: 5] Number of forum thread tags (part of thread metadata) to use for + estimating tx fee + + -g, --tagLen=tagLen [default: 10] Single tag length (part of thread metadata) to use for estimating + tx fee + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + + -p, --initialPostLen=initialPostLen [default: 200] Thread's initial post length to use for estimating tx fee + + -t, --titleLen=titleLen [default: 20] Thread title (part of thread metadata) length to use for estimating + tx fee +``` + +_See code: [src/commands/fee-profile/createForumThread.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/createForumThread.ts)_ + +## `joystream-cli fee-profile:createVideo` + +Create fee profile of content.create_video extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:createVideo + +OPTIONS + -S, --storageBucketsNum=storageBucketsNum Number of storage buckets to use for estimating tx fee. + By default this number will be based on the current chain's + dynamic bag policy for channel bags + + -T, --thumbnailSize=thumbnailSize [default: 1] Thumbnail photo size in MB to use for estimating + the costs + + -c, --categoryLen=categoryLen [default: 10] Video cateogry (part of video metadata) length to + use for estimating tx fee + + -d, --descriptionLen=descriptionLen [default: 200] Video description (part of video metadata) + length to use for estimating tx fee + + -f, --subtitlesFileSize=subtitlesFileSize [default: 1] Single subtitles file/asset size in MB to use for + estimating the costs + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + + -m, --mediaSize=mediaSize [default: 200] Video media file size in MB to use for + estimating the costs + + -s, --subtitlesNum=subtitlesNum [default: 1] Number of subtitles (subtitle assets) to use for + estimating the costs + + -t, --titleLen=titleLen [default: 15] Video title (part of video metadata) length to + use for estimating tx fee + + -w, --nftAuctionWhitelistSize=nftAuctionWhitelistSize If `--withNft` is provided - determines auction whitelist size + in nft's InitTransactionalStatus to use when estimating tx fee + (Default: 0) + + --noMedia If provided - video with no media asset will be used for + estimating the costs + + --noThumbnail If provided - video with no thumbnail asset will be used for + estimating the costs + + --withNft If provided - `auto_issue_nft` parameter will be set when + estimating tx fee +``` + +_See code: [src/commands/fee-profile/createVideo.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/createVideo.ts)_ + +## `joystream-cli fee-profile:deleteChannel` + +Create fee profile of content.delete_channel extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:deleteChannel + +OPTIONS + -D, --distributionBucketsNum=distributionBucketsNum Number of distribution buckets to use for estimating tx fee. + By default this number will be based on the current chain's + dynamic bag policy for channel bags + + -S, --storageBucketsNum=storageBucketsNum Number of storage buckets to use for estimating tx fee. + By default this number will be based on the current chain's + dynamic bag policy for channel bags + + -a, --assetsNum=assetsNum [default: 2] Number of assets to use for estimating the + costs/returns + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD +``` + +_See code: [src/commands/fee-profile/deleteChannel.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/deleteChannel.ts)_ + +## `joystream-cli fee-profile:deleteForumPost` + +Create fee profile of forum.delete_posts extrinsic (single post case). + +``` +USAGE + $ joystream-cli fee-profile:deleteForumPost + +OPTIONS + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD + -r, --rationaleLen=rationaleLen [default: 0] Default rationale length to use for estimating tx fee +``` + +_See code: [src/commands/fee-profile/deleteForumPost.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/deleteForumPost.ts)_ + +## `joystream-cli fee-profile:deleteForumThread` + +Create fee profile of forum.delete_thread extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:deleteForumThread + +OPTIONS + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD +``` + +_See code: [src/commands/fee-profile/deleteForumThread.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/deleteForumThread.ts)_ + +## `joystream-cli fee-profile:deleteVideo` + +Create fee profile of forum.delete_video extrinsic. + +``` +USAGE + $ joystream-cli fee-profile:deleteVideo + +OPTIONS + -S, --storageBucketsNum=storageBucketsNum Number of storage buckets to use for estimating tx fee. + By default this number will be based on the current chain's dynamic bag + policy for channel bags + + -a, --assetsNum=assetsNum [default: 2] Number of assets to use for estimating the costs/returns + + -j, --joyPrice=joyPrice [default: 6] Joy price in USD cents for estimating costs in USD +``` + +_See code: [src/commands/fee-profile/deleteVideo.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/fee-profile/deleteVideo.ts)_ + ## `joystream-cli forum:addPost` Add forum post. @@ -1158,7 +1765,7 @@ OPTIONS --all see all commands in CLI ``` -_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.2.2/src/commands/help.ts)_ +_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v3.3.1/src/commands/help.ts)_ ## `joystream-cli membership:addStakingAccount` @@ -1224,6 +1831,23 @@ ALIASES _See code: [src/commands/membership/details.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/membership/details.ts)_ +## `joystream-cli membership:memberRemark MESSAGE` + +Member remarks + +``` +USAGE + $ joystream-cli membership:memberRemark MESSAGE + +ARGUMENTS + MESSAGE Remark message + +OPTIONS + --useMemberId=useMemberId Try using the specified member id as context whenever possible +``` + +_See code: [src/commands/membership/memberRemark.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/membership/memberRemark.ts)_ + ## `joystream-cli membership:update` Update existing membership metadata and/or handle. @@ -1258,6 +1882,37 @@ OPTIONS _See code: [src/commands/membership/updateAccounts.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/membership/updateAccounts.ts)_ +## `joystream-cli sign-offline:signUnsignedTx` + +Sign an unsigned transaction. Does not require an api connection. + +``` +USAGE + $ joystream-cli sign-offline:signUnsignedTx + +OPTIONS + -i, --input=input Path to JSON file to use as input (if not specified - the input can be provided + interactively) + + -o, --output=output Path to the file where the JSON with full transaction details should be + saved.If omitted, only the signed transaction, the signature and the tx hash is + included + + --backupFilePath=backupFilePath Path to account backup JSON file + + --keypairType=(sr25519|ed25519|ecdsa) [default: sr25519] Account type (defaults to sr25519) + + --mnemonic=mnemonic Mnemonic phrase + + --password=password Account password + + --seed=seed Secret seed + + --suri=suri Substrate uri +``` + +_See code: [src/commands/sign-offline/signUnsignedTx.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/sign-offline/signUnsignedTx.ts)_ + ## `joystream-cli staking:validate` Start validating. Takes the controller key. @@ -1287,9 +1942,9 @@ ARGUMENTS WGAPPLICATIONID Working Group Application ID OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1310,9 +1965,9 @@ USAGE $ joystream-cli working-groups:apply OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --answers=answers @@ -1351,9 +2006,9 @@ ARGUMENTS OPENINGID Opening ID OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1377,9 +2032,9 @@ OPTIONS -e, --edit If provided along with --input - launches in edit mode allowing to modify the input before sending the exstinsic - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. -i, --input=input @@ -1389,7 +2044,7 @@ OPTIONS Path to the file where the output JSON should be saved (this output can be then reused as input) --dryRun - If provided along with --output - skips sending the actual extrinsic(can be used to generate a "draft" which can be + If provided along with --output - skips sending the actual extrinsic(can be used to generate a "draft" which can be provided as input later) --stakeTopUpSource=stakeTopUpSource @@ -1423,9 +2078,9 @@ ARGUMENTS AMOUNT Amount of JOY to decrease the current worker stake by OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1449,9 +2104,9 @@ ARGUMENTS WORKERID Worker ID OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --penalty=penalty @@ -1478,9 +2133,9 @@ USAGE $ joystream-cli working-groups:fillOpening OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --applicationIds=applicationIds @@ -1510,9 +2165,9 @@ ARGUMENTS AMOUNT Amount of JOY to increase the current stake by OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1533,9 +2188,9 @@ USAGE $ joystream-cli working-groups:leaveRole OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --rationale=rationale @@ -1558,9 +2213,9 @@ USAGE $ joystream-cli working-groups:opening OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --id=id @@ -1587,9 +2242,9 @@ USAGE $ joystream-cli working-groups:openings OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --upcoming @@ -1613,9 +2268,9 @@ USAGE $ joystream-cli working-groups:overview OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1636,9 +2291,9 @@ USAGE $ joystream-cli working-groups:removeUpcomingOpening OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. -i, --id=id @@ -1662,9 +2317,9 @@ USAGE $ joystream-cli working-groups:setDefaultGroup OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1689,9 +2344,9 @@ ARGUMENTS AMOUNT Slash amount OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --rationale=rationale @@ -1714,9 +2369,9 @@ USAGE $ joystream-cli working-groups:updateGroupMetadata OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. -i, --input=input @@ -1743,9 +2398,9 @@ ARGUMENTS ADDRESS New reward account address (if omitted, can be provided interactivel) OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1769,9 +2424,9 @@ ARGUMENTS ADDRESS New role account address (if omitted, can be provided interactively) OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId @@ -1783,32 +2438,6 @@ OPTIONS _See code: [src/commands/working-groups/updateRoleAccount.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/working-groups/updateRoleAccount.ts)_ -## `joystream-cli working-groups:updateRoleStorage STORAGE` - -Updates the associated worker storage - -``` -USAGE - $ joystream-cli working-groups:updateRoleStorage STORAGE - -ARGUMENTS - STORAGE Worker storage - -OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) - The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, - distributors. - - --useMemberId=useMemberId - Try using the specified member id as context whenever possible - - --useWorkerId=useWorkerId - Try using the specified worker id as context whenever possible -``` - -_See code: [src/commands/working-groups/updateRoleStorage.ts](https://github.com/Joystream/joystream/blob/master/cli/src/commands/working-groups/updateRoleStorage.ts)_ - ## `joystream-cli working-groups:updateWorkerReward WORKERID NEWREWARD` Change given worker's reward (amount only). Requires lead access. @@ -1822,9 +2451,9 @@ ARGUMENTS NEWREWARD New reward OPTIONS - -g, --group=(storageProviders|curators|forum|membership|gateway|builders|humanResources|marketing|distributors) + -g, --group=(storageProviders|curators|forum|membership|app|builders|humanResources|marketing|distributors) The working group context in which the command should be executed - Available values are: storageProviders, curators, forum, membership, gateway, builders, humanResources, marketing, + Available values are: storageProviders, curators, forum, membership, app, builders, humanResources, marketing, distributors. --useMemberId=useMemberId diff --git a/cli/examples/content/CreateCategory.json b/cli/examples/content/CreateCategory.json index 0a13be6737..965f1cc4c7 100644 --- a/cli/examples/content/CreateCategory.json +++ b/cli/examples/content/CreateCategory.json @@ -1,3 +1,4 @@ { - "name": "Nature" + "name": "Nature", + "description": "Videos about nature" } diff --git a/cli/examples/content/CreateChannel.json b/cli/examples/content/CreateChannel.json index 1dd0d56743..a8122fa03b 100644 --- a/cli/examples/content/CreateChannel.json +++ b/cli/examples/content/CreateChannel.json @@ -3,10 +3,7 @@ "description": "This is an awesome example channel!", "isPublic": true, "language": "en", - "category": 1, "avatarPhotoPath": "./avatar-photo-1.png", "coverPhotoPath": "./cover-photo-1.png", - "rewardAccount": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", - "collaborators": [], - "moderators": [] + "collaborators": [] } diff --git a/cli/examples/content/CreateVideo.json b/cli/examples/content/CreateVideo.json index 41d929ebab..4e6bd0bbce 100644 --- a/cli/examples/content/CreateVideo.json +++ b/cli/examples/content/CreateVideo.json @@ -8,7 +8,7 @@ "isPublic": true, "isExplicit": false, "persons": [], - "category": 1, + "category": "00000001", "license": { "code": 1001, "attribution": "by Joystream Contributors" @@ -17,5 +17,9 @@ "isPublished": true, "date": "2020-01-01" }, + "subtitles": [ + { "type": "subtitle", "language": "en", "mimeType": "text/plain", "subtitleAssetPath": "./subtitle-en-1.srt" }, + { "type": "subtitle", "language": "fr", "mimeType": "text/plain", "subtitleAssetPath": "./subtitle-fr-1.srt" } + ], "enableComments": true } diff --git a/cli/examples/content/ModerationPermissionsByLevel.json b/cli/examples/content/ModerationPermissionsByLevel.json new file mode 100644 index 0000000000..354a0b72cd --- /dev/null +++ b/cli/examples/content/ModerationPermissionsByLevel.json @@ -0,0 +1,18 @@ +[ + { + "channelPrivilegeLevel": 0, + "permissions": [ + { "HideVideo": null }, + { "ChangeChannelFeatureStatus": "CreatorTokenIssuance" }, + { "DeleteVideoAssets": true } + ] + }, + { + "channelPrivilegeLevel": 1, + "permissions": [ + { "HideChannel": null }, + { "ChangeChannelFeatureStatus": "VideoUpdate" }, + { "DeleteVideoAssets": false } + ] + } +] diff --git a/cli/examples/content/UpdateChannel.json b/cli/examples/content/UpdateChannel.json index 5d63bff287..f737113d3d 100644 --- a/cli/examples/content/UpdateChannel.json +++ b/cli/examples/content/UpdateChannel.json @@ -1,5 +1,4 @@ { "title": "Example Joystream Channel [UPDATED!]", - "avatarPhotoPath": "./avatar-photo-2.png", - "rewardAccount": null + "avatarPhotoPath": "./avatar-photo-2.png" } diff --git a/cli/examples/content/UpdateVideo.json b/cli/examples/content/UpdateVideo.json index dab631c19b..92f7cbfff7 100644 --- a/cli/examples/content/UpdateVideo.json +++ b/cli/examples/content/UpdateVideo.json @@ -4,5 +4,9 @@ "publishedBeforeJoystream": { "isPublished": false }, - "license": {} + "license": {}, + "subtitles": [ + { "type": "subtitle", "language": "en", "mimeType": "SRT", "subtitleAssetPath": "./subtitle-en-2.srt" }, + { "type": "subtitle", "language": "fr", "mimeType": "SRT", "subtitleAssetPath": "./subtitle-fr-2.srt" } + ] } diff --git a/cli/examples/content/subtitle-en-1.srt b/cli/examples/content/subtitle-en-1.srt new file mode 100644 index 0000000000..d0c14c3cb4 --- /dev/null +++ b/cli/examples/content/subtitle-en-1.srt @@ -0,0 +1,4 @@ +1 +00:05:00,400 --> 00:05:15,300 +This is an example of +a subtitle. \ No newline at end of file diff --git a/cli/examples/content/subtitle-en-2.srt b/cli/examples/content/subtitle-en-2.srt new file mode 100644 index 0000000000..e11895664d --- /dev/null +++ b/cli/examples/content/subtitle-en-2.srt @@ -0,0 +1,4 @@ +1 +00:05:16,400 --> 00:05:25,300 +Ceci est un exemple de +un sous-titre - 2ème sous-titre. \ No newline at end of file diff --git a/cli/examples/content/subtitle-fr-1.srt b/cli/examples/content/subtitle-fr-1.srt new file mode 100644 index 0000000000..6295b0576c --- /dev/null +++ b/cli/examples/content/subtitle-fr-1.srt @@ -0,0 +1,4 @@ +1 +00:05:00,400 --> 00:05:15,300 +Ceci est un exemple de +un sous-titre. \ No newline at end of file diff --git a/cli/examples/content/subtitle-fr-2.srt b/cli/examples/content/subtitle-fr-2.srt new file mode 100644 index 0000000000..6295b0576c --- /dev/null +++ b/cli/examples/content/subtitle-fr-2.srt @@ -0,0 +1,4 @@ +1 +00:05:00,400 --> 00:05:15,300 +Ceci est un exemple de +un sous-titre. \ No newline at end of file diff --git a/cli/package.json b/cli/package.json index cb77ae8751..ae2830f6f3 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,29 +1,31 @@ { "name": "@joystream/cli", "description": "Command Line Interface for Joystream community and governance activities", - "version": "0.8.0", + "version": "0.10.0", "author": "Leszek Wiesner", "bin": { "joystream-cli": "./bin/run" }, "bugs": "https://github.com/Joystream/joystream/issues", "dependencies": { - "@apollo/client": "^3.3.13", - "cross-fetch": "^3.0.6", "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@ffprobe-installer/ffprobe": "^1.1.0", - "@joystream/metadata-protobuf": "^2.1.0", - "@joystream/types": "^0.19.3", + "@apollo/client": "^3.3.13", + "@ffprobe-installer/ffprobe": "^1.4.1", + "@joystream/metadata-protobuf": "^2.5.0", + "@joystream/types": "^0.20.5", "@oclif/command": "^1.5.19", "@oclif/config": "^1.14.0", "@oclif/plugin-autocomplete": "^0.2.0", "@oclif/plugin-help": "^3.2.2", "@oclif/plugin-not-found": "^1.2.4", "@oclif/plugin-warn-if-update-available": "^1.7.0", - "@polkadot/api": "5.9.1", - "@polkadot/keyring": "7.3.1", - "@polkadot/util": "7.3.1", - "@polkadot/util-crypto": "7.3.1", + "@polkadot/api": "8.9.1", + "@polkadot/keyring": "9.5.1", + "@polkadot/util": "9.5.1", + "@polkadot/util-crypto": "9.5.1", + "@substrate/txwrapper-core": "3.1.3", + "@substrate/txwrapper-substrate": "3.1.3", + "@substrate/txwrapper-polkadot": "3.1.3", "@types/cli-progress": "^3.9.1", "@types/fluent-ffmpeg": "^2.1.16", "@types/inquirer": "^6.5.0", @@ -32,9 +34,15 @@ "@types/slug": "^0.9.1", "ajv": "^6.11.0", "axios": "^0.21.1", + "blake3-wasm": "^2.1.5", + "chalk": "^4.1.2", "cli-progress": "^3.9.0", "cli-ux": "^5.4.5", + "cross-fetch": "^3.0.6", "fluent-ffmpeg": "^2.1.2", + "form-data": "^4.0.0", + "graphql": "^14.7.0", + "graphql-tag": "^2.12.6", "inquirer": "^7.1.0", "inquirer-datepicker-prompt": "^0.4.2", "ipfs-http-client": "^47.0.1", @@ -46,18 +54,19 @@ "it-to-buffer": "^1.0.4", "mime-types": "^2.1.30", "moment": "^2.24.0", + "multihashes": "^4.0.3", "proper-lockfile": "^4.1.1", "slug": "^2.1.1", - "tslib": "^1.11.1", - "blake3-wasm": "^2.1.5", - "multihashes": "^4.0.3", - "form-data": "^4.0.0", - "graphql": "^14.7.0" + "tslib": "^1.11.1" }, "devDependencies": { + "@graphql-codegen/cli": "^1.21.4", + "@graphql-codegen/import-types-preset": "^1.18.1", + "@graphql-codegen/typescript": "^1.22.0", + "@graphql-codegen/typescript-document-nodes": "^2.2.11", + "@graphql-codegen/typescript-operations": "^1.17.16", "@oclif/dev-cli": "^1.22.2", "@oclif/test": "^1.2.5", - "@polkadot/ts": "^0.4.8", "@types/chai": "^4.2.11", "@types/mocha": "^5.2.7", "@types/node": "^10.17.18", @@ -66,16 +75,11 @@ "eslint-config-oclif": "^3.1.0", "eslint-config-oclif-typescript": "^0.1.0", "globby": "^10.0.2", + "json-schema-to-typescript": "^10.1.4", "mocha": "^5.2.0", "nyc": "^14.1.1", "ts-node": "^10.2.1", - "typescript": "^4.4.3", - "json-schema-to-typescript": "^10.1.4", - "@graphql-codegen/cli": "^1.21.4", - "@graphql-codegen/typescript": "^1.22.0", - "@graphql-codegen/import-types-preset": "^1.18.1", - "@graphql-codegen/typescript-operations": "^1.17.16", - "@graphql-codegen/typescript-document-nodes": "^1.17.11" + "typescript": "^4.4.3" }, "engines": { "node": ">=14.0.0", @@ -128,6 +132,15 @@ }, "staking": { "description": "Staking and validation commands" + }, + "fee-profile": { + "description": "Commands for generating the fee profiles of some common extrinsics" + }, + "advanced-transactions": { + "description": "Commands for constructing (unsigned) transactions online, which can be signed with 'sign-offline'" + }, + "sign-offline": { + "description": "Sign unsigned transactions, created with 'advanced-transactions', offline" } } }, diff --git a/cli/src/Api.ts b/cli/src/Api.ts index 57b17323f2..fb0f0ed7f7 100644 --- a/cli/src/Api.ts +++ b/cli/src/Api.ts @@ -1,43 +1,57 @@ -import BN from 'bn.js' -import { createType, types } from '@joystream/types' +import { createType, AsCodec } from '@joystream/types' +import { + ApplicationId, + ChannelId, + CuratorGroupId, + DataObjectId, + ForumCategoryId as CategoryId, + ForumPostId as PostId, + ForumThreadId as ThreadId, + MemberId, + VideoId, + WorkerId, +} from '@joystream/types/primitives' +import { CLIError } from '@oclif/errors' import { ApiPromise, WsProvider } from '@polkadot/api' -import { SubmittableExtrinsic, AugmentedQuery } from '@polkadot/api/types' -import { formatBalance } from '@polkadot/util' -import { Balance, LockIdentifier, StakingLedger, ElectionStatus } from '@polkadot/types/interfaces' +import { DeriveBalancesAll } from '@polkadot/api-derive/types' +import { AugmentedQuery, SubmittableExtrinsic } from '@polkadot/api/types' import { KeyringPair } from '@polkadot/keyring/types' +import { Option, UInt, u64 } from '@polkadot/types' +import { Balance, AccountId, LockIdentifier, StakingLedger } from '@polkadot/types/interfaces' +import { + PalletContentChannelRecord as Channel, + PalletContentPermissionsCuratorGroupCuratorGroupRecord as CuratorGroup, + PalletContentVideoRecord as Video, + PalletForumCategory as Category, + PalletForumPost as Post, + PalletForumThread as Thread, + PalletMembershipMembershipObject as Membership, + PalletMembershipStakingAccountMemberBinding as StakingAccountMemberBinding, + PalletStorageBagIdType as BagId, + PalletStorageBagRecord, + PalletStorageDataObject as DataObject, + PalletWorkingGroupGroupWorker as Worker, + PalletWorkingGroupJobApplication as Application, + PalletWorkingGroupOpening as Opening, +} from '@polkadot/types/lookup' import { Codec, Observable } from '@polkadot/types/types' -import { UInt, Option } from '@polkadot/types' +import { formatBalance } from '@polkadot/util' +import { blake2AsHex } from '@polkadot/util-crypto' +import BN from 'bn.js' +import chalk from 'chalk' +import _ from 'lodash' +import { MembershipFieldsFragment } from './graphql/generated/queries' +import QueryNodeApi from './QueryNodeApi' import { AccountSummary, - WorkingGroups, - Reward, - GroupMember, ApplicationDetails, + GroupMember, + MemberDetails, OpeningDetails, + Reward, UnaugmentedApiPromise, - MemberDetails, + WorkingGroups, } from './Types' -import { DeriveBalancesAll } from '@polkadot/api-derive/types' -import { CLIError } from '@oclif/errors' -import { Worker, WorkerId, OpeningId, Application, ApplicationId, Opening } from '@joystream/types/working-group' -import { Membership, StakingAccountMemberBinding } from '@joystream/types/members' -import { MemberId, ChannelId, AccountId, ThreadId, PostId } from '@joystream/types/common' -import { - Channel, - Video, - ChannelCategoryId, - VideoId, - CuratorGroupId, - CuratorGroup, - VideoCategoryId, -} from '@joystream/types/content' -import { BagId, DataObject, DataObjectId } from '@joystream/types/storage' -import QueryNodeApi from './QueryNodeApi' -import { MembershipFieldsFragment } from './graphql/generated/queries' -import { blake2AsHex } from '@polkadot/util-crypto' -import { Category, CategoryId, Post, Thread } from '@joystream/types/forum' -import chalk from 'chalk' -import _ from 'lodash' export const DEFAULT_API_URI = 'ws://localhost:9944/' @@ -47,7 +61,7 @@ export const apiModuleByGroup = { [WorkingGroups.Curators]: 'contentWorkingGroup', [WorkingGroups.Forum]: 'forumWorkingGroup', [WorkingGroups.Membership]: 'membershipWorkingGroup', - [WorkingGroups.Gateway]: 'gatewayWorkingGroup', + [WorkingGroups.App]: 'appWorkingGroup', [WorkingGroups.Builders]: 'operationsWorkingGroupAlpha', [WorkingGroups.HumanResources]: 'operationsWorkingGroupBeta', [WorkingGroups.Marketing]: 'operationsWorkingGroupGamma', @@ -72,12 +86,12 @@ export default class Api { // Get api for use-cases where no type augmentations are desirable public getUnaugmentedApi(): UnaugmentedApiPromise { - return (this._api as unknown) as UnaugmentedApiPromise + return this._api as unknown as UnaugmentedApiPromise } private static async initApi(apiUri: string = DEFAULT_API_URI, metadataCache: Record) { const wsProvider: WsProvider = new WsProvider(apiUri) - const api = new ApiPromise({ provider: wsProvider, types, metadata: metadataCache }) + const api = new ApiPromise({ provider: wsProvider, metadata: metadataCache }) await api.isReadyOrError const [properties, chainType] = await Promise.all([api.rpc.system.properties(), api.rpc.system.chainType()]) @@ -132,8 +146,8 @@ export default class Api { // Working groups async entriesByIds( apiMethod: AugmentedQuery<'promise', (key: IDType) => Observable, [IDType]> - ): Promise<[IDType, ValueType][]> { - const entries: [IDType, ValueType][] = (await apiMethod.entries()).map(([storageKey, value]) => [ + ): Promise<[IDType, AsCodec][]> { + const entries: [IDType, AsCodec][] = (await apiMethod.entries()).map(([storageKey, value]) => [ storageKey.args[0] as IDType, value, ]) @@ -143,8 +157,8 @@ export default class Api { async entriesByAccountIds( apiMethod: AugmentedQuery<'promise', (key: AccountType) => Observable, [AccountType]> - ): Promise<[AccountType, ValueType][]> { - const entries: [AccountType, ValueType][] = (await apiMethod.entries()).map(([storageKey, value]) => [ + ): Promise<[AccountType, AsCodec][]> { + const entries: [AccountType, AsCodec][] = (await apiMethod.entries()).map(([storageKey, value]) => [ storageKey.args[0] as AccountType, value, ]) @@ -194,7 +208,7 @@ export default class Api { async memberDetailsById(memberId: MemberId | number): Promise { const membership = await this._api.query.members.membershipById(memberId) - return membership.isEmpty ? null : await this.memberDetails(createType('MemberId', memberId), membership) + return membership.isNone ? null : await this.memberDetails(createType('u64', memberId), membership.unwrap()) } async expectedMemberDetailsById(memberId: MemberId | number): Promise { @@ -207,17 +221,24 @@ export default class Api { } async getMembers(ids: MemberId[] | number[]): Promise { - return this._api.query.members.membershipById.multi(ids) + return (await this._api.query.members.membershipById.multi(ids)).map((optionalMember, i) => { + if (optionalMember.isSome) { + return optionalMember.unwrap() + } + throw new CLIError(`Member ${ids[i]} does not exist!`) + }) } async membersDetailsByIds(ids: MemberId[] | number[]): Promise { const memberships = await this.getMembers(ids) - const entries: [MemberId, Membership][] = ids.map((id, i) => [createType('MemberId', id), memberships[i]]) + const entries: [MemberId, Membership][] = ids.map((id, i) => [createType('u64', id), memberships[i]]) return this.membersDetails(entries) } async allMembersDetails(): Promise { - const entries = await this.entriesByIds(this._api.query.members.membershipById) + const entries: [u64, Membership][] = (await this.entriesByIds(this._api.query.members.membershipById)).map( + ([id, m]) => [id, m.unwrap()] + ) return this.membersDetails(entries) } @@ -236,24 +257,24 @@ export default class Api { protected async fetchStake(account: AccountId | string, group: WorkingGroups): Promise { const groupLockId = this._api.consts[apiModuleByGroup[group]].stakingHandlerLockId - return this._api.createType( + return this._api.createType( 'Balance', new BN((await this._api.query.balances.locks(account)).find((lock) => lock.id.eq(groupLockId))?.amount || 0) ) } protected async parseGroupMember(group: WorkingGroups, id: WorkerId, worker: Worker): Promise { - const roleAccount = worker.role_account_id - const stakingAccount = worker.staking_account_id - const memberId = worker.member_id + const roleAccount = worker.roleAccountId + const stakingAccount = worker.stakingAccountId + const memberId = worker.memberId const profile = await this.expectedMemberDetailsById(memberId) - const stake = await this.fetchStake(worker.staking_account_id, group) + const stake = await this.fetchStake(worker.stakingAccountId, group) const reward: Reward = { - valuePerBlock: worker.reward_per_block.unwrapOr(undefined), - totalMissed: worker.missed_reward.unwrapOr(undefined), + valuePerBlock: worker.rewardPerBlock.unwrapOr(undefined), + totalMissed: worker.missedReward.unwrapOr(undefined), } return { @@ -270,16 +291,16 @@ export default class Api { async workerByWorkerId(group: WorkingGroups, workerId: WorkerId | number): Promise { const worker = await this.workingGroupApiQuery(group).workerById(workerId) - if (worker.isEmpty) { + if (worker.isNone) { throw new CLIError(`Worker ${chalk.magentaBright(workerId)} does not exist!`) } - return worker + return worker.unwrap() } async groupMember(group: WorkingGroups, workerId: number): Promise { const worker = await this.workerByWorkerId(group, workerId) - return await this.parseGroupMember(group, this._api.createType('WorkerId', workerId), worker) + return await this.parseGroupMember(group, createType('u64', workerId), worker) } async groupMembers(group: WorkingGroups): Promise { @@ -292,12 +313,12 @@ export default class Api { return groupMembers.reverse() // Sort by newest } - groupWorkers(group: WorkingGroups): Promise<[WorkerId, Worker][]> { - return this.entriesByIds(this.workingGroupApiQuery(group).workerById) + async groupWorkers(group: WorkingGroups): Promise<[WorkerId, Worker][]> { + return (await this.entriesByIds(this.workingGroupApiQuery(group).workerById)).map(([id, w]) => [id, w.unwrap()]) } async openingsByGroup(group: WorkingGroups): Promise { - const openings = await this.entriesByIds(this.workingGroupApiQuery(group).openingById) + const openings = await this.entriesByIds(this.workingGroupApiQuery(group).openingById) return Promise.all(openings.map(([id, opening]) => this.fetchOpeningDetails(group, opening, id.toNumber()))) } @@ -311,11 +332,11 @@ export default class Api { const result = await this.workingGroupApiQuery(group).applicationById(applicationId) - if (result.isEmpty) { + if (result.isNone) { throw new CLIError(`Application of ID=${applicationId} no longer exists!`) } - return result + return result.unwrap() } protected async fetchApplicationDetails( @@ -326,12 +347,12 @@ export default class Api { const qnData = await this._qnApi?.applicationDetailsById(group, applicationId) return { applicationId, - member: await this.expectedMemberDetailsById(application.member_id), - roleAccout: application.role_account_id, - rewardAccount: application.reward_account_id, - stakingAccount: application.staking_account_id, - descriptionHash: application.description_hash.toString(), - openingId: application.opening_id.toNumber(), + member: await this.expectedMemberDetailsById(application.memberId), + roleAccount: application.roleAccountId, + rewardAccount: application.rewardAccountId, + stakingAccount: application.stakingAccountId, + descriptionHash: application.descriptionHash.toString(), + openingId: application.openingId.toNumber(), answers: qnData?.answers, } } @@ -342,14 +363,12 @@ export default class Api { } protected async groupOpeningApplications(group: WorkingGroups, openingId: number): Promise { - const applicationEntries = await this.entriesByIds( - this.workingGroupApiQuery(group).applicationById - ) + const applicationEntries = await this.entriesByIds(this.workingGroupApiQuery(group).applicationById) return Promise.all( applicationEntries - .filter(([, application]) => application.opening_id.eqn(openingId)) - .map(([id, application]) => this.fetchApplicationDetails(group, id.toNumber(), application)) + .filter(([, application]) => application.unwrap().openingId.eqn(openingId)) + .map(([id, application]) => this.fetchApplicationDetails(group, id.toNumber(), application.unwrap())) ) } @@ -372,10 +391,10 @@ export default class Api { async fetchOpeningDetails(group: WorkingGroups, opening: Opening, openingId: number): Promise { const qnData = await this._qnApi?.openingDetailsById(group, openingId) const applications = await this.groupOpeningApplications(group, openingId) - const type = opening.opening_type + const type = opening.openingType const stake = { - unstakingPeriod: opening.stake_policy.leaving_unstaking_period.toNumber(), - value: opening.stake_policy.stake_amount, + unstakingPeriod: opening.stakePolicy.leavingUnstakingPeriod.toNumber(), + value: opening.stakePolicy.stakeAmount, } return { @@ -384,7 +403,7 @@ export default class Api { type, stake, createdAtBlock: opening.created.toNumber(), - rewardPerBlock: opening.reward_per_block.unwrapOr(undefined), + rewardPerBlock: opening.rewardPerBlock.unwrapOr(undefined), metadata: qnData?.metadata || undefined, } } @@ -395,7 +414,7 @@ export default class Api { } async allMembers(): Promise<[MemberId, Membership][]> { - return this.entriesByIds(this._api.query.members.membershipById) + return (await this.entriesByIds(this._api.query.members.membershipById)).map(([id, m]) => [id, m.unwrap()]) } // Content directory @@ -419,9 +438,9 @@ export default class Api { return await this._api.query.staking.ledger(account) } - async getEraElectionStatus(): Promise { - return await this._api.query.staking.eraElectionStatus() - } + // async getEraElectionStatus(): Promise { + // return await this._api.consts.staking.eraElectionStatus() + // } async curatorGroupById(id: number): Promise { const exists = !!(await this._api.query.content.curatorGroupById.size(id)).toNumber() @@ -443,6 +462,10 @@ export default class Api { return channel } + async channelBagByChannelId(channelId: ChannelId | number): Promise { + return this._api.query.storage.bags(createType('PalletStorageBagIdType', { Dynamic: { Channel: channelId } })) + } + async videoById(videoId: VideoId | number | string): Promise

= Omit & { type: JSONTypeName

-} & (P extends AnyPrimitive +} & (IsUnion> extends true + ? { enum?: P[] } + : P extends AnyPrimitive ? { properties?: never } : P extends (infer T)[] ? { properties?: never; items: PropertySchema } @@ -293,3 +333,16 @@ export type TokenRequestData = { storageBucketId: number bagId: string } + +export type OfflineTransactionData = { + unsigned: UnsignedTransaction + signingPayload: string + txData: { + call: string + callHash: string + } + multisigTxData?: { + call: string + callHash: string + } +} diff --git a/cli/src/base/AccountsCommandBase.ts b/cli/src/base/AccountsCommandBase.ts index abc47bb202..2f2fdfa3bc 100644 --- a/cli/src/base/AccountsCommandBase.ts +++ b/cli/src/base/AccountsCommandBase.ts @@ -9,7 +9,7 @@ import { formatBalance } from '@polkadot/util' import { NamedKeyringPair } from '../Types' import { DeriveBalancesAll } from '@polkadot/api-derive/types' import { toFixedLength } from '../helpers/display' -import { MemberId, AccountId } from '@joystream/types/common' +import { MemberId } from '@joystream/types/primitives' import { KeyringPair, KeyringInstance, KeyringOptions } from '@polkadot/keyring/types' import { KeypairType } from '@polkadot/util-crypto/types' import { createTestKeyring } from '@polkadot/keyring/testing' @@ -17,14 +17,16 @@ import chalk from 'chalk' import { mnemonicGenerate } from '@polkadot/util-crypto' import { validateAddress } from '../helpers/validation' import slug from 'slug' -import { Membership } from '@joystream/types/members' -import { LockIdentifier } from '@polkadot/types/interfaces' +import { PalletMembershipMembershipObject as Membership } from '@polkadot/types/lookup' +import { LockIdentifier, AccountId } from '@polkadot/types/interfaces' import BN from 'bn.js' +import { JOYSTREAM_ADDRESS_PREFIX } from '@joystream/types' const ACCOUNTS_DIRNAME = 'accounts' export const DEFAULT_ACCOUNT_TYPE = 'sr25519' export const KEYRING_OPTIONS: KeyringOptions = { type: DEFAULT_ACCOUNT_TYPE, + ss58Format: JOYSTREAM_ADDRESS_PREFIX, } export const STAKING_ACCOUNT_CANDIDATE_STAKE = new BN(200) @@ -347,13 +349,13 @@ export default abstract class AccountsCommandBase extends ApiCommandBase { const { balances } = await this.getApi().getAccountSummary(address) const stakingStatus = await this.getApi().stakingAccountStatus(address) - if (lockId && !this.getApi().areAccountLocksCompatibleWith(address, lockId)) { + if (lockId && !(await this.getApi().areAccountLocksCompatibleWith(address, lockId))) { throw new CLIError( 'This account is already used for other, incompatible staking purposes. Choose a different account...' ) } - if (stakingStatus && !stakingStatus.member_id.eq(memberId)) { + if (stakingStatus && !stakingStatus.memberId.eq(memberId)) { throw new CLIError( 'This account is already used as staking accout by other member, choose a different account...' ) @@ -417,7 +419,7 @@ export default abstract class AccountsCommandBase extends ApiCommandBase { if (!stakingStatus || stakingStatus.confirmed.isFalse) { await this.sendAndFollowNamedTx( - await this.getDecodedPair(member.controller_account.toString()), + await this.getDecodedPair(member.controllerAccount.toString()), 'members', 'confirmStakingAccount', [memberId, address] diff --git a/cli/src/base/AdvancedTransactionsCommandBase.ts b/cli/src/base/AdvancedTransactionsCommandBase.ts new file mode 100644 index 0000000000..da5f3388f5 --- /dev/null +++ b/cli/src/base/AdvancedTransactionsCommandBase.ts @@ -0,0 +1,298 @@ +import AccountsCommandBase from './AccountsCommandBase' +import { + defineMethod, + OptionsWithMeta, + TxInfo, + TxMethod, + BaseTxInfo, + UnsignedTransaction, +} from '@substrate/txwrapper-core' +import { createSigningPayload } from '@substrate/txwrapper-core/lib/core/construct' +import { Call } from '@polkadot/types/interfaces' +import { JOYSTREAM_ADDRESS_PREFIX, registry } from '@joystream/types' +import chalk from 'chalk' +import { getInputJson, saveOutputJsonToFile } from '../helpers/InputOutput' +import { OfflineTransactionData } from '../Types' +import { MultiSigApproveAsMulti, MultisigAsMulti } from '@substrate/txwrapper-substrate/lib/methods/multisig' +import { Timepoint } from '@substrate/txwrapper-substrate/lib/methods/multisig/types' +import { createKeyMulti, encodeAddress, sortAddresses } from '@polkadot/util-crypto' +import ExitCodes from '../ExitCodes' +import fs from 'fs' + +export default abstract class AdvancedTransactionsCommandBase extends AccountsCommandBase { + async getApproveAsMultiInputFromFile(filePath: string): Promise { + return getInputJson(filePath) + } + + async getAsMultiInputFromFile(filePath: string): Promise { + return getInputJson(filePath) + } + + async parseWasm(inputPath: string): Promise { + let code: string + try { + code = fs.readFileSync(inputPath).toString('hex') + } catch (e) { + this.error(`Cannot access the input file at: ${inputPath}`, { exit: ExitCodes.FsOperationFailed }) + } + return code + } + + async getCallInput(inputCall: string | undefined, inputCallFile: string | undefined): Promise { + if (inputCall) { + return inputCall + } else if (inputCallFile) { + const callFile = await this.getCallFromFile(inputCallFile) + return callFile.call + } else { + this.error(`No call provided.`, { exit: ExitCodes.InvalidInput }) + } + } + + async getCallFromFile(filePath: string): Promise<{ call: string }> { + return await getInputJson<{ call: string }>(filePath) + } + + async getInitMsInputs( + input: string | undefined, + threshold: number | undefined, + others: string | undefined, + callHash: string, + maxWeight: number + ): Promise { + let argsInput: MultiSigApproveAsMulti + let otherSignatories: string[] = [] + if (input) { + argsInput = await this.getApproveAsMultiInputFromFile(input) + otherSignatories = sortAddresses(argsInput.otherSignatories, JOYSTREAM_ADDRESS_PREFIX) + } else if (threshold && others) { + otherSignatories = sortAddresses(others.split(','), JOYSTREAM_ADDRESS_PREFIX) + argsInput = { + threshold, + otherSignatories, + maybeTimepoint: null, + callHash, + maxWeight, + } + } else { + this.error('Missing required input', { exit: ExitCodes.InvalidInput }) + } + const args: MultiSigApproveAsMulti = { + threshold: argsInput.threshold, + otherSignatories, + maybeTimepoint: null, + callHash, + maxWeight, + } + if (argsInput.callHash !== args.callHash) { + this.error( + `The hash of the input "call": ${args.callHash} does not match the input "callHash" ${argsInput.callHash}.`, + { exit: ExitCodes.InvalidInput } + ) + } + + if (argsInput.maxWeight.toString() !== args.maxWeight.toString()) { + this.warn(`"maxWeight" changed from ${argsInput.maxWeight} to ${args.maxWeight}.`) + } + return args + } + + async getApproveMsInputs( + input: string | undefined, + threshold: number | undefined, + timepointHeight: number | undefined, + timepointIndex: number | undefined, + others: string | undefined, + callHash: string, + maxWeight: number + ): Promise { + let argsInput: MultiSigApproveAsMulti + let otherSignatories: string[] = [] + if (input) { + argsInput = await this.getApproveAsMultiInputFromFile(input) + otherSignatories = sortAddresses(argsInput.otherSignatories, JOYSTREAM_ADDRESS_PREFIX) + } else if (threshold && others && timepointHeight && timepointIndex) { + otherSignatories = sortAddresses(others.split(','), JOYSTREAM_ADDRESS_PREFIX) + const maybeTimepoint: Timepoint = { + height: timepointHeight, + index: timepointIndex, + } + argsInput = { + threshold, + otherSignatories, + maybeTimepoint, + callHash, + maxWeight, + } + } else { + this.error('Missing required input', { exit: ExitCodes.InvalidInput }) + } + const args: MultiSigApproveAsMulti = { + threshold: parseInt(argsInput.threshold.toString()), + otherSignatories, + maybeTimepoint: argsInput.maybeTimepoint, + callHash: callHash, + maxWeight, + } + if (argsInput.callHash !== args.callHash) { + this.error( + `The hash of the input "call": ${args.callHash} does not match the input "callHash" ${argsInput.callHash}.`, + { exit: ExitCodes.InvalidInput } + ) + } + + if (argsInput.maxWeight.toString() !== args.maxWeight.toString()) { + this.warn(`"maxWeight" changed from ${argsInput.maxWeight} to ${args.maxWeight}.`) + } + return args + } + + async getFinalMsInputs( + input: string | undefined, + threshold: number | undefined, + timepointHeight: number | undefined, + timepointIndex: number | undefined, + others: string | undefined, + call: string, + maxWeight: number + ): Promise { + if (input) { + const args = await this.getAsMultiInputFromFile(input) + const otherSignatories = args.otherSignatories as string[] + const otherSignatoriesSorted = sortAddresses(otherSignatories, JOYSTREAM_ADDRESS_PREFIX) + args.otherSignatories = otherSignatoriesSorted + const maxWeightChanged = maxWeight !== (args.maxWeight as number) + if (maxWeightChanged) { + this.warn(`"maxWeight" changed from ${args.maxWeight} to ${maxWeight}.`) + } + args.maxWeight = maxWeight + return args + } else if (threshold && others && timepointHeight && timepointIndex) { + const otherSignatories = sortAddresses(others.split(','), JOYSTREAM_ADDRESS_PREFIX) + const maybeTimepoint: Timepoint = { + height: timepointHeight, + index: timepointIndex, + } + return { + threshold, + otherSignatories, + maybeTimepoint, + call, + storeCall: false, + maxWeight, + } + } else { + this.error('Missing required input', { exit: ExitCodes.InvalidInput }) + } + } + + async getBaseTxInfo( + account: string, + nonceIncrement: number, + eraPeriod: number | undefined, + tip: number | undefined + ): Promise { + const genesisHash = (await this.getOriginalApi().rpc.chain.getBlockHash(0)).toString() + const blockHash = (await this.getOriginalApi().rpc.chain.getFinalizedHead()).toString() + const blockNumber = (await this.getOriginalApi().rpc.chain.getHeader(blockHash)).number.toNumber() + const metadata = (await this.getOriginalApi().rpc.state.getMetadata(blockHash)).toHex().slice(2) + const version = await this.getOriginalApi().rpc.state.getRuntimeVersion() + const accountData = await this.getOriginalApi().query.system.account(account) + const baseTxInfo: BaseTxInfo = { + address: account, + blockHash, + blockNumber, + genesisHash, + metadataRpc: `0x${metadata}`, + nonce: accountData.nonce.toNumber() + nonceIncrement, + specVersion: version.specVersion.toNumber(), + tip, + eraPeriod, + transactionVersion: version.transactionVersion.toNumber(), + } + return baseTxInfo + } + + async getTxInfo( + account: string, + method: TxMethod, + nonceIncrement: number, + eraPeriod: number | undefined, + tip: number + ): Promise { + const genesisHash = (await this.getOriginalApi().rpc.chain.getBlockHash(0)).toString() + const blockHash = (await this.getOriginalApi().rpc.chain.getFinalizedHead()).toString() + const blockNumber = (await this.getOriginalApi().rpc.chain.getHeader(blockHash)).number.toNumber() + const metadata = (await this.getOriginalApi().rpc.state.getMetadata(blockHash)).toHex().slice(2) + const version = await this.getOriginalApi().rpc.state.getRuntimeVersion() + const accountData = await this.getOriginalApi().query.system.account(account) + if (eraPeriod) { + const ceil = Math.ceil(Math.log2(eraPeriod)) + const floor = Math.floor(Math.log2(eraPeriod)) + if (eraPeriod < 4 || eraPeriod > 65536 || ceil !== floor) { + this.error(`Invalid "lifetime" input.`, { exit: ExitCodes.InvalidInput }) + } + } + const txInfo: TxInfo = { + address: account, + blockHash, + blockNumber, + genesisHash, + metadataRpc: `0x${metadata}`, + nonce: accountData.nonce.toNumber() + nonceIncrement, + specVersion: version.specVersion.toNumber(), + tip, + eraPeriod, + transactionVersion: version.transactionVersion.toNumber(), + method, + } + return txInfo + } + + async getMsAddress(threshold: number, others: string[], signer?: string): Promise { + const allSignatories = [...others] + if (signer) { + allSignatories.push(signer) + } + const msAddress = encodeAddress( + createKeyMulti(sortAddresses(allSignatories, JOYSTREAM_ADDRESS_PREFIX), threshold), + JOYSTREAM_ADDRESS_PREFIX + ) + return msAddress + } + + async getDefinedMethod(txInfo: TxInfo, optionsWithMeta: OptionsWithMeta): Promise { + const unsigned = defineMethod(txInfo, optionsWithMeta) + return unsigned + } + + async getWeight(call: Call): Promise { + const callData = this.getOriginalApi().tx(call) + const paymentWeight = await this.getOriginalApi().rpc.payment.queryInfo(callData.toHex()) + return paymentWeight.weight.toNumber() + } + + createTransactionReadyForSigning( + unsigned: UnsignedTransaction, + output: string, + unsignedTxData: { call: string; callHash: string }, + multisigTxData?: { call: string; callHash: string } + ): void { + unsigned.signedExtensions.push('CheckEra') + const signingPayload = createSigningPayload(unsigned, { registry }) + const transactionInputs: OfflineTransactionData = { + unsigned, + signingPayload, + txData: unsignedTxData, + } + if (multisigTxData) { + transactionInputs.multisigTxData = multisigTxData + } + try { + saveOutputJsonToFile(output, transactionInputs) + this.log(chalk.green(`Output successfully saved in: ${chalk.magentaBright(output)}!`)) + } catch (e) { + this.warn(`Could not save output to ${output}!`) + } + } +} diff --git a/cli/src/base/ApiCommandBase.ts b/cli/src/base/ApiCommandBase.ts index 2aa3e9bf9a..28d2827668 100644 --- a/cli/src/base/ApiCommandBase.ts +++ b/cli/src/base/ApiCommandBase.ts @@ -30,6 +30,7 @@ import { formatBalance } from '@polkadot/util' import cli from 'cli-ux' import BN from 'bn.js' import _ from 'lodash' +import { TxMethod, Args } from '@substrate/txwrapper-polkadot' export class ExtrinsicFailedError extends Error {} @@ -477,6 +478,49 @@ export default abstract class ApiCommandBase extends StateAwareCommandBase { return values } + async promptForExtrinsicArgs(module: string, method: string): Promise<{ argName: string; argType: string }[]> { + const extrinsicMethod = (await this.getUnaugmentedApi().tx)[module][method] + + const param: { argName: string; argType: string }[] = [] + + this.openIndentGroup() + for (const arg of extrinsicMethod.meta.args.toArray()) { + const argName = arg.name.toString() + const argType = arg.type.toString() + param.push({ + argName, + argType, + }) + } + this.closeIndentGroup() + return param + } + + async promptForTxMethod(module: string, method: string, paramsOptions?: ApiParamsOptions): Promise { + const extrinsicMethod = (await this.getUnaugmentedApi().tx)[module][method] + const args: Args = {} + + this.openIndentGroup() + for (const arg of extrinsicMethod.meta.args.toArray()) { + const argName = arg.name.toString() + const argType = arg.type.toString() + let argOptions = paramsOptions && paramsOptions[argName] + if (!argOptions?.forcedName) { + argOptions = { ...argOptions, forcedName: argName } + } + const value: ApiMethodArg = await this.promptForParam(argType, argOptions) + args[argName] = value.toString() + } + this.closeIndentGroup() + + const txMethod: TxMethod = { + args, + name: method, + pallet: module, + } + return txMethod + } + sendExtrinsic(account: KeyringPair, tx: SubmittableExtrinsic<'promise'>): Promise { return new Promise((resolve, reject) => { let unsubscribe: () => void diff --git a/cli/src/base/ContentDirectoryCommandBase.ts b/cli/src/base/ContentDirectoryCommandBase.ts index 625afc6b20..28ce6980a7 100644 --- a/cli/src/base/ContentDirectoryCommandBase.ts +++ b/cli/src/base/ContentDirectoryCommandBase.ts @@ -1,21 +1,32 @@ import ExitCodes from '../ExitCodes' import { WorkingGroups } from '../Types' -import { CuratorGroup, CuratorGroupId, ContentActor, Channel } from '@joystream/types/content' -import { Worker } from '@joystream/types/working-group' +import { + PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission, + PalletContentPermissionsCuratorGroupIterableEnumsContentModerationAction as ContentModerationAction, + PalletContentPermissionsCuratorGroupCuratorGroupRecord as CuratorGroup, + PalletWorkingGroupGroupWorker as Worker, + PalletContentPermissionsContentActor as ContentActor, + PalletContentChannelRecord as Channel, + PalletContentChannelOwner as ChannelOwner, +} from '@polkadot/types/lookup' + import { CLIError } from '@oclif/errors' import { flags } from '@oclif/command' import { memberHandle } from '../helpers/display' -import { MemberId } from '@joystream/types/common' -import { createType } from '@joystream/types' +import { MemberId, CuratorGroupId, ChannelPrivilegeLevel, ChannelId } from '@joystream/types/primitives' +import { CreateInterface, createType } from '@joystream/types' import WorkingGroupCommandBase from './WorkingGroupCommandBase' +import BN from 'bn.js' -const CHANNEL_CREATION_CONTEXTS = ['Member', 'Curator'] as const +const CHANNEL_CREATION_CONTEXTS = ['Member', 'CuratorGroup'] as const const CATEGORIES_CONTEXTS = ['Lead', 'Curator'] as const -const CHANNEL_MANAGEMENT_CONTEXTS = ['Owner', 'Collaborator'] as const +const MODERATION_ACTION_CONTEXTS = ['Lead', 'Curator'] as const +const CHANNEL_MANAGEMENT_CONTEXTS = ['Owner', 'Curator', 'Collaborator'] as const type ChannelManagementContext = typeof CHANNEL_MANAGEMENT_CONTEXTS[number] type ChannelCreationContext = typeof CHANNEL_CREATION_CONTEXTS[number] type CategoriesContext = typeof CATEGORIES_CONTEXTS[number] +type ModerationActionContext = typeof MODERATION_ACTION_CONTEXTS[number] /** * Abstract base class for commands related to content directory @@ -37,6 +48,12 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo options: [...CHANNEL_MANAGEMENT_CONTEXTS], }) + static moderationActionContextFlag = flags.enum({ + required: false, + description: `Actor context to execute the command in (${MODERATION_ACTION_CONTEXTS.join('/')})`, + options: [...MODERATION_ACTION_CONTEXTS], + }) + static categoriesContextFlag = flags.enum({ required: false, description: `Actor context to execute the command in (${CATEGORIES_CONTEXTS.join('/')})`, @@ -74,38 +91,98 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo } getCurationActorByChannel(channel: Channel): Promise<[ContentActor, string]> { - return channel.owner.isOfType('Curators') ? this.getContentActor('Lead') : this.getContentActor('Curator') + return channel.owner.isCuratorGroup ? this.getContentActor('Lead') : this.getContentActor('Curator') } async getChannelOwnerActor(channel: Channel): Promise<[ContentActor, string]> { - if (channel.owner.isOfType('Curators')) { - try { - return this.getContentActor('Lead') - } catch (e) { - return this.getCuratorContext(channel.owner.asType('Curators')) - } - } else { - const { id, membership } = await this.getRequiredMemberContext(false, [channel.owner.asType('Member')]) - return [ - createType('ContentActor', { Member: id }), - membership.controller_account.toString(), - ] + if (channel.owner.isCuratorGroup) { + return this.getContentActor('Lead') } + const { id, membership } = await this.getRequiredMemberContext(false, [channel.owner.asMember]) + return [createType('PalletContentPermissionsContentActor', { Member: id }), membership.controllerAccount.toString()] } async getChannelCollaboratorActor(channel: Channel): Promise<[ContentActor, string]> { - const { id, membership } = await this.getRequiredMemberContext(false, Array.from(channel.collaborators)) - return [ - createType('ContentActor', { Member: id }), - membership.controller_account.toString(), - ] + const { id, membership } = await this.getRequiredMemberContext(false, Array.from(channel.collaborators.keys())) + return [createType('PalletContentPermissionsContentActor', { Member: id }), membership.controllerAccount.toString()] } isChannelOwner(channel: Channel, actor: ContentActor): boolean { - return channel.owner.isOfType('Curators') - ? (actor.isOfType('Curator') && actor.asType('Curator')[0].eq(channel.owner.asType('Curators'))) || - actor.isOfType('Lead') - : actor.isOfType('Member') && actor.asType('Member').eq(channel.owner.asType('Member')) + return channel.owner.isCuratorGroup + ? (actor.isCurator && actor.asCurator[0].eq(channel.owner.asCuratorGroup)) || actor.isLead + : actor.isMember && actor.asMember.eq(channel.owner.asMember) + } + + async hasRequiredChannelAgentPermissions( + actor: ContentActor, + channel: Channel, + requiredPermissions: ChannelActionPermission['type'][] + ): Promise { + // CASE: CuratorGroup owned channel + if (channel.owner.isCuratorGroup) { + // Lead context + if (actor.isLead) { + return true + } + // Curator context + if (actor.isCurator && actor.asCurator[0].eq(channel.owner.asCuratorGroup)) { + const { curators } = await this.getCuratorGroup(actor.asCurator[0].toNumber()) + const curatorChannelAgentPermissions = [...curators].find(([k]) => k.eq(actor.asCurator[1]))?.[1] + return !!( + curatorChannelAgentPermissions && + requiredPermissions.every((requiredPermission) => + [...curatorChannelAgentPermissions].find((p) => p[`is${requiredPermission}`]) + ) + ) + } + // Collaborator context + const collaboratorChannelAgentPermissions = [...channel.collaborators].find(([k]) => k.eq(actor.asMember))?.[1] + return !!( + collaboratorChannelAgentPermissions && + requiredPermissions.every((requiredPermission) => + [...collaboratorChannelAgentPermissions].find((p) => p[`is${requiredPermission}`]) + ) + ) + } + + // CASE: Member owned channel + if (channel.owner.isMember) { + // Owner context + if (actor.isMember && actor.asMember.eq(channel.owner.asMember)) { + return true + } + // Collaborator context + const collaboratorChannelAgentPermissions = [...channel.collaborators].find(([k]) => k.eq(actor.asMember))?.[1] + return !!( + collaboratorChannelAgentPermissions && + requiredPermissions.every((requiredPermission) => + [...collaboratorChannelAgentPermissions].find((p) => p[`is${requiredPermission}`]) + ) + ) + } + + return false + } + + async isModeratorWithRequiredPermission( + actor: ContentActor, + channelPrivilegeLevel: ChannelPrivilegeLevel, + permission: CreateInterface + ): Promise { + if (actor.isLead) { + return true + } + + const permissionRequired = createType( + 'PalletContentPermissionsCuratorGroupIterableEnumsContentModerationAction', + permission + ) + const { permissionsByLevel } = await this.getCuratorGroup(actor.asCurator[0].toNumber()) + const permissionsForLevel = [...permissionsByLevel].find(([k]) => k.eq(channelPrivilegeLevel))?.[1] + return !!( + permissionsForLevel && + [...permissionsForLevel].find((p) => p.type === permissionRequired.type && p.value.eq(permissionRequired.value)) + ) } async getChannelManagementActor( @@ -115,6 +192,9 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo if (context && context === 'Owner') { return this.getChannelOwnerActor(channel) } + if (context && context === 'Curator' && channel.owner.isCuratorGroup) { + return this.getCuratorContext(channel.owner.asCuratorGroup) + } if (context && context === 'Collaborator') { return this.getChannelCollaboratorActor(channel) } @@ -129,6 +209,16 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo // continue } + try { + if (channel.owner.isCuratorGroup) { + const curator = await this.getCuratorContext(channel.owner.asCuratorGroup) + this.log('Derived context: Curator') + return curator + } + } catch (e) { + // continue + } + try { const collaborator = await this.getChannelCollaboratorActor(channel) this.log('Derived context: Channel collaborator') @@ -140,6 +230,36 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo this.error('No account found with access to manage the provided channel', { exit: ExitCodes.AccessDenied }) } + async getModerationActionActor(context: ModerationActionContext): Promise<[ContentActor, string]> { + if (context && context === 'Lead') { + const lead = await this.getRequiredLeadContext() + return [createType('PalletContentPermissionsContentActor', { Lead: null }), lead.roleAccount.toString()] + } + if (context && context === 'Curator') { + return this.getCuratorContext() + } + + // Context not set - derive + + try { + const lead = await this.getRequiredLeadContext() + this.log('Derived context: Lead') + return [createType('PalletContentPermissionsContentActor', { Lead: null }), lead.roleAccount.toString()] + } catch (e) { + // continue + } + + try { + const curator = await this.getCuratorContext() + this.log('Derived context: Curator') + return curator + } catch (e) { + // continue + } + + this.error('No account found with access to perform given moderation action', { exit: ExitCodes.AccessDenied }) + } + async getCategoryManagementActor(): Promise<[ContentActor, string]> { try { const lead = await this.getContentActor('Lead') @@ -168,7 +288,7 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo if (!group.active.valueOf()) { this.error(`Curator group ${requiredGroupId.toString()} is no longer active`, { exit: ExitCodes.AccessDenied }) } - if (!Array.from(group.curators).some((curatorId) => curatorId.eq(curator.workerId))) { + if (!Array.from(group.curators).some(([curatorId]) => curatorId.eq(curator.workerId))) { this.error(`You don't belong to required curator group (ID: ${requiredGroupId.toString()})`, { exit: ExitCodes.AccessDenied, }) @@ -179,7 +299,7 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo const availableGroupIds = groups .filter( ([, group]) => - group.active.valueOf() && Array.from(group.curators).some((curatorId) => curatorId.eq(curator.workerId)) + group.active.valueOf() && Array.from(group.curators).some(([curatorId]) => curatorId.eq(curator.workerId)) ) .map(([id]) => id) @@ -193,7 +313,7 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo } return [ - createType('ContentActor', { Curator: [groupId, curator.workerId.toNumber()] }), + createType('PalletContentPermissionsContentActor', { Curator: [groupId, curator.workerId.toNumber()] }), curator.roleAccount.toString(), ] } @@ -287,14 +407,29 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo return group } - async getContentActor( - context: Exclude - ): Promise<[ContentActor, string]> { + async getChannelOwner(context: ChannelOwner['type']): Promise<[ChannelOwner, string]> { + if (context === 'Member') { + const { id, membership } = await this.getRequiredMemberContext() + + return [createType('PalletContentChannelOwner', { Member: id }), membership.controllerAccount.toString()] + } + + if (context === 'CuratorGroup') { + const lead = await this.getRequiredLeadContext() + const curatorGroupId = await this.promptForCuratorGroup() + + return [createType('PalletContentChannelOwner', { CuratorGroup: curatorGroupId }), lead.roleAccount.toString()] + } + + throw new Error(`Unrecognized context: ${context}`) + } + + async getContentActor(context: ContentActor['type']): Promise<[ContentActor, string]> { if (context === 'Member') { const { id, membership } = await this.getRequiredMemberContext() return [ - createType('ContentActor', { Member: id }), - membership.controller_account.toString(), + createType('PalletContentPermissionsContentActor', { Member: id }), + membership.controllerAccount.toString(), ] } @@ -304,7 +439,7 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo if (context === 'Lead') { const lead = await this.getRequiredLeadContext() - return [createType('ContentActor', { Lead: null }), lead.roleAccount.toString()] + return [createType('PalletContentPermissionsContentActor', { Lead: null }), lead.roleAccount.toString()] } throw new Error(`Unrecognized context: ${context}`) @@ -318,4 +453,58 @@ export default abstract class ContentDirectoryCommandBase extends WorkingGroupCo }) } } + + public async getChannelBagWitness( + channelId: ChannelId | number + ): Promise<{ storageBucketsNum: number; distributionBucketsNum: number }> { + const channelBag = await this.getApi().channelBagByChannelId(channelId) + return { + storageBucketsNum: channelBag.storedBy.size, + distributionBucketsNum: channelBag.distributedBy.size, + } + } + + public async getStorageBucketsNumWitness(channelId: ChannelId | number): Promise { + const channelBag = await this.getApi().channelBagByChannelId(channelId) + return channelBag.storedBy.size + } + + async getDataObjectsInfoFromQueryNode(channelId: number): Promise<[string, BN][]> { + const dataObjects = await this.getQNApi().dataObjectsByBagId(`dynamic:channel:${channelId}`) + + if (dataObjects.length) { + this.log('Following data objects are still associated with the channel:') + dataObjects.forEach((o) => { + let parentStr = '' + if ('video' in o.type && o.type.video) { + parentStr = ` (video: ${o.type.video.id})` + } + this.log(`- ${o.id} - ${o.type.__typename}${parentStr}`) + }) + } + + return dataObjects.map((o) => [o.id, new BN(o.stateBloatBond)]) + } + + async getDataObjectsInfoFromChain(channelId: number): Promise<[string, BN][]> { + const dataObjects = await this.getApi().dataObjectsInBag( + createType('PalletStorageBagIdType', { Dynamic: { Channel: channelId } }) + ) + + if (dataObjects.length) { + const dataObjectIds = dataObjects.map(([id]) => id.toString()) + this.log(`Following data objects are still associated with the channel: ${dataObjectIds.join(', ')}`) + } + + return dataObjects.map(([id, o]) => [id.toString(), o.stateBloatBond.amount]) + } + + async getVideosInfoFromQueryNode(channelId: number): Promise<[string, BN][]> { + const channel = await this.getQNApi().getChannelById(channelId.toString()) + if (!channel) { + this.error('Could not fetch the channel info from the query node', { exit: ExitCodes.QueryNodeError }) + } + + return channel.videos.map(({ id, videoStateBloatBond }) => [id, videoStateBloatBond]) + } } diff --git a/cli/src/base/DefaultCommandBase.ts b/cli/src/base/DefaultCommandBase.ts index 7b0f9d2a25..02cc808661 100644 --- a/cli/src/base/DefaultCommandBase.ts +++ b/cli/src/base/DefaultCommandBase.ts @@ -21,6 +21,7 @@ export default abstract class DefaultCommandBase extends Command { } output(value: unknown): void { + this.log('') console.log(value) } diff --git a/cli/src/base/FeeProfileCommandBase.ts b/cli/src/base/FeeProfileCommandBase.ts new file mode 100644 index 0000000000..34f34308c7 --- /dev/null +++ b/cli/src/base/FeeProfileCommandBase.ts @@ -0,0 +1,133 @@ +import ApiCommandBase from './ApiCommandBase' +import { flags } from '@oclif/command' +import { KEYRING_OPTIONS } from './AccountsCommandBase' +import { createTestPairs } from '@polkadot/keyring/testingPairs' +import { KeyringPair } from '@polkadot/keyring/types' +import { formatBalance, formatNumber } from '@polkadot/util' +import BN from 'bn.js' +import _ from 'lodash' +import { PalletStorageDataObjectCreationParameters } from '@polkadot/types/lookup' +import { createType } from '@joystream/types' +import chalk from 'chalk' +import { SubmittableExtrinsic } from '@polkadot/api/types' + +const DEFAULT_JOY_PRICE = 6 // 6 cents + +type TestPairs = { + alice: KeyringPair + bob: KeyringPair +} + +type SingleValueProfile = { + hapi: string + joy: number + usd: number +} + +type ProfileRecord = Record + +type TxWeightData = { + base: string + extra: string + total: string +} + +type FullProfile = { + txClass: string + txLength: number + txWeight: TxWeightData + costs: ProfileRecord + returns: ProfileRecord + diff: SingleValueProfile +} + +/** + * Abstract base class for fee-profile commands. + */ +export default abstract class FeeProfileCommandBase extends ApiCommandBase { + pairs: TestPairs = createTestPairs(KEYRING_OPTIONS) as TestPairs + joyPrice = DEFAULT_JOY_PRICE + + static flags = { + joyPrice: flags.integer({ + required: false, + char: 'j', + description: 'Joy price in USD cents for estimating costs in USD', + default: DEFAULT_JOY_PRICE, + }), + } + + async init(): Promise { + await super.init() + const { joyPrice } = this.parse(this.constructor as typeof FeeProfileCommandBase).flags + this.log('Assumed JOY price: ' + chalk.greenBright(`$${_.round(joyPrice / 100, 4)}`)) + this.joyPrice = joyPrice + } + + asJoy(hapi: BN): number { + return _.round(Number(formatBalance(hapi, { forceUnit: 'JOY', withUnit: false }).replace(',', '')), 4) + } + + asUsd(hapi: BN): number { + const joy = this.asJoy(hapi) + return _.round((joy * this.joyPrice) / 100, 4) + } + + mockAsset(sizeMB: number): PalletStorageDataObjectCreationParameters { + return createType('PalletStorageDataObjectCreationParameters', { + size_: sizeMB * 1024 * 1024, + ipfsContentId: _.repeat('x', 46), + }) + } + + generateValueProfile(hapi: BN): SingleValueProfile { + return { + hapi: this.formatBN(hapi), + joy: this.asJoy(hapi), + usd: this.asUsd(hapi), + } + } + + generateProfileRecord(values: Record): ProfileRecord { + values.total = _.reduce(values, (total, curr) => total.add(curr), new BN(0)) + return _.mapValues(values, (hapi) => this.generateValueProfile(hapi)) + } + + // format BN as string in a way that allows reusing the string as input for BN constructor, + // but is also more human-readible (for example: "1 000 000 000") + formatBN(bn: BN): string { + return formatNumber(bn).replace(/,/g, ' ') + } + + async profile( + tx: SubmittableExtrinsic<'promise'>, + costs: Record = {}, + returns: Record = {} + ): Promise { + await tx.signAsync(this.pairs.alice) + const txLength = tx.encodedLength + const { weight, partialFee: inclusionFee, class: txClass } = await tx.paymentInfo(this.pairs.alice) + const { + perClass: { + [txClass.type.toLowerCase() as 'normal' | 'operational' | 'mandatory']: { baseExtrinsic: baseExtrinsicWeight }, + }, + } = this.getOriginalApi().consts.system.blockWeights + costs.inclusionFee = inclusionFee + const costsProfile = this.generateProfileRecord(costs) + const returnsProfile = this.generateProfileRecord(returns) + const diff = this.generateValueProfile(new BN(returnsProfile.total.hapi).sub(new BN(costsProfile.total.hapi))) + const output: FullProfile = { + txClass: txClass.type, + txLength, + txWeight: { + base: this.formatBN(baseExtrinsicWeight), + extra: this.formatBN(weight), + total: this.formatBN(baseExtrinsicWeight.add(weight)), + }, + costs: costsProfile, + returns: returnsProfile, + diff, + } + this.output(output) + } +} diff --git a/cli/src/base/ForumCommandBase.ts b/cli/src/base/ForumCommandBase.ts index b7b99ca233..15720e3608 100644 --- a/cli/src/base/ForumCommandBase.ts +++ b/cli/src/base/ForumCommandBase.ts @@ -1,13 +1,22 @@ -import { Category, CategoryId, Post, PrivilegedActor, Thread } from '@joystream/types/forum' +import { + PalletForumCategory as Category, + PalletForumPost as Post, + PalletForumPrivilegedActor as PrivilegedActor, + PalletForumThread as Thread, +} from '@polkadot/types/lookup' import { WorkingGroups } from '../Types' import { flags } from '@oclif/command' import WorkingGroupCommandBase from './WorkingGroupCommandBase' import chalk from 'chalk' import ExitCodes from '../ExitCodes' import { createType } from '@joystream/types' -import { AccountId, PostId, ThreadId } from '@joystream/types/common' -import { WorkerId } from '@joystream/types/working-group' - +import { + WorkerId, + ForumPostId as PostId, + ForumThreadId as ThreadId, + ForumCategoryId as CategoryId, +} from '@joystream/types/primitives' +import { AccountId } from '@polkadot/types/interfaces' const FORUM_MODERATION_CONTEXT = ['Leader', 'Moderator'] as const type ForumModerationContext = typeof FORUM_MODERATION_CONTEXT[number] @@ -99,17 +108,14 @@ export default abstract class ForumCommandBase extends WorkingGroupCommandBase { } return Array.from(categoriesCountByModeratorId.entries()) .filter(([, count]) => count === categories.length) - .map(([id]) => createType('WorkerId', id)) + .map(([id]) => createType('u64', id)) } async getForumModeratorContext(categories: CategoryId[] | number[]): Promise<[AccountId, PrivilegedActor]> { const moderators = await this.getIdsOfModeratorsWithAccessToCategories(categories) try { const worker = await this.getRequiredWorkerContext('Role', moderators) - return [ - worker.roleAccount, - createType('PrivilegedActor', { Moderator: worker.workerId }), - ] + return [worker.roleAccount, createType('PalletForumPrivilegedActor', { Moderator: worker.workerId })] } catch (e) { this.error( `Moderator access to categories: ${categories @@ -122,7 +128,7 @@ export default abstract class ForumCommandBase extends WorkingGroupCommandBase { async getForumLeadContext(): Promise<[AccountId, PrivilegedActor]> { const lead = await this.getRequiredLeadContext() - return [lead.roleAccount, createType('PrivilegedActor', 'Lead')] + return [lead.roleAccount, createType('PalletForumPrivilegedActor', 'Lead')] } async getForumModerationContext( diff --git a/cli/src/base/MembershipsCommandBase.ts b/cli/src/base/MembershipsCommandBase.ts index 5654bad82d..626f91db05 100644 --- a/cli/src/base/MembershipsCommandBase.ts +++ b/cli/src/base/MembershipsCommandBase.ts @@ -1,7 +1,7 @@ import ExitCodes from '../ExitCodes' import { MemberDetails } from '../Types' import { memberHandle } from '../helpers/display' -import { MemberId } from '@joystream/types/common' +import { MemberId } from '@joystream/types/primitives' import { flags } from '@oclif/command' import AccountsCommandBase from './AccountsCommandBase' @@ -44,12 +44,11 @@ export default abstract class MembershipsCommandBase extends AccountsCommandBase const membersDetails = allowedIds ? await this.getApi().membersDetailsByIds(allowedIds) : await this.getApi().allMembersDetails() + const availableMemberships = await Promise.all( membersDetails.filter((m) => this.isKeyAvailable( - accountType === 'controller' - ? m.membership.controller_account.toString() - : m.membership.root_account.toString() + accountType === 'controller' ? m.membership.controllerAccount.toString() : m.membership.rootAccount.toString() ) ) ) diff --git a/cli/src/base/SignOfflineCommandBase.ts b/cli/src/base/SignOfflineCommandBase.ts new file mode 100644 index 0000000000..c53a93cf0f --- /dev/null +++ b/cli/src/base/SignOfflineCommandBase.ts @@ -0,0 +1,160 @@ +import StateAwareCommandBase from './StateAwareCommandBase' +import { NamedKeyringPair, OfflineTransactionData } from '../Types' +import { Keyring } from '@polkadot/api' +import { getInputJson } from '../helpers/InputOutput' +import { KeyringPair } from '@polkadot/keyring/types' +import { GenericExtrinsicPayload, GenericExtrinsicPayloadV4 } from '@polkadot/types' +// import { waitReady } from '@polkadot/wasm-crypto' +import { initWasm } from '@polkadot/wasm-crypto/initOnlyAsm' +import { JOYSTREAM_ADDRESS_PREFIX, registry } from '@joystream/types' +import inquirer from 'inquirer' +import { DecodedSigningPayload } from '@substrate/txwrapper-core' +import { MultiSigApproveAsMulti, MultisigAsMulti } from '@substrate/txwrapper-substrate/lib/methods/multisig' +import { blake2AsHex, createKeyMulti, encodeAddress, sortAddresses } from '@polkadot/util-crypto' +import { Timepoint } from '@substrate/txwrapper-substrate/lib/methods/multisig/types' + +export default abstract class SignOfflineCommandBase extends StateAwareCommandBase { + getPair(keyring: Keyring, key: string): NamedKeyringPair { + return keyring.getPair(key) as NamedKeyringPair + } + + isKeyAvailable(keyring: Keyring, key: string): boolean { + return keyring.getPairs().some((p) => p.address === key.toString()) + } + + async createPayload(signingPayload: string): Promise { + await initWasm() + const payload = registry.createType('ExtrinsicPayload', signingPayload, { + version: 4, + }) + return payload + } + + async createPayloadV4(signingPayload: string): Promise { + await initWasm() + const payload = registry.createType('ExtrinsicPayloadV4', signingPayload) + return payload + } + + async getInputFromFile(filePath: string): Promise { + return getInputJson(filePath) + } + + multiCheck( + signerAddress: string, + signingPayloadDecoded: DecodedSigningPayload, + multisigTxData: { call: string; callHash: string } + ): void { + if (signingPayloadDecoded.method.name === 'approveAsMulti') { + const args = signingPayloadDecoded.method.args as MultiSigApproveAsMulti + if (blake2AsHex(multisigTxData.call) === args.callHash.toString()) { + const allSignatories = [...args.otherSignatories] + allSignatories.push(signerAddress) + const threshold = parseInt(args.threshold.toString()) + const allSignatoriesSorted = sortAddresses(allSignatories, JOYSTREAM_ADDRESS_PREFIX) + const multiAddress = encodeAddress(createKeyMulti(allSignatoriesSorted, threshold), JOYSTREAM_ADDRESS_PREFIX) + if (args.maybeTimepoint == null) { + this.log( + `You are initiating (and the first to approve) a multisig transaction from ${multiAddress} as ${signerAddress}.` + ) + this.log( + `The setup means ${threshold - 1}/${ + allSignatoriesSorted.length + } more signer(s) needs to approve in order to execute` + ) + } else { + this.log(`You are approving a multisig transaction from ${multiAddress} as ${signerAddress}.`) + this.log( + `The transaction you want to approve was included as the ${args.maybeTimepoint.index} in block ${args.maybeTimepoint.height}.` + ) + this.log( + `If you are the final signer to approve (meaning ${threshold - 1} of ${ + allSignatoriesSorted.length + } has approved already), you need to construct the unsigned transaction again with 'constructUnsignedTxApproveMs'` + ) + } + if (multisigTxData.call.length < 500) { + this.log(`the call ${multisigTxData.call}`) + } else { + this.log(`the call is to too long for log. Check the output file.`) + } + } else { + this.error( + `The callHash you want to approve: ${args.callHash.toString()} n\` ` + + `does not match the encoded call: ${multisigTxData.call}.` + ) + } + } else if (signingPayloadDecoded.method.name === 'asMulti') { + const args = signingPayloadDecoded.method.args as MultisigAsMulti + const allSignatories = [...(args.otherSignatories as string[])] + allSignatories.push(signerAddress) + const threshold = parseInt((args.threshold ?? 1).toString()) + const timepoint = args.maybeTimepoint as Timepoint + const allSignatoriesSorted = sortAddresses(allSignatories, JOYSTREAM_ADDRESS_PREFIX) + const multiAddress = encodeAddress(createKeyMulti(allSignatoriesSorted, threshold), JOYSTREAM_ADDRESS_PREFIX) + if (args.maybeTimepoint != null) { + this.log(`You are the final approver of a multisig transaction from ${multiAddress} as ${signerAddress}.`) + this.log( + `The transaction you want to approve was included as the ${timepoint.index} in block ${timepoint.height}.` + ) + this.log( + `If you are not the final signer to approve (meaning ${threshold - 1} of ${ + allSignatoriesSorted.length + } has approved already), you need to construct the unsigned transaction again with 'constructUnsignedTxFinalApproveMs'` + ) + } else { + if (threshold === 1) { + this.log( + `You are initiating, and the final/only approver of a multisig transaction from ${multiAddress} as ${signerAddress}.` + ) + } + this.error(`Only with an 1/m multisig can you both initiate and be the final approver.`) + } + // } else if (signingPayloadDecoded.method.name == "cancelAsMulti") { + // ... + } else { + this.error(`Not a multisig`) + } + } + + async requestPairDecoding(pair: KeyringPair, message?: string): Promise { + // Skip if pair already unlocked + if (!pair.isLocked) { + return pair + } + + // First - try decoding using empty string + try { + pair.decodePkcs8('') + return pair + } catch (e) { + // Continue... + } + + let isPassValid = false + while (!isPassValid) { + try { + const password = await this.promptForPassword( + message || `Enter ${pair.meta.name ? pair.meta.name : pair.address} account password` + ) + pair.decodePkcs8(password) + isPassValid = true + } catch (e) { + this.warn('Invalid password... Try again.') + } + } + return pair + } + + async promptForPassword(message = "Your account's password"): Promise { + const { password } = await inquirer.prompt([ + { + name: 'password', + type: 'password', + message, + }, + ]) + + return password + } +} diff --git a/cli/src/base/StakingCommandBase.ts b/cli/src/base/StakingCommandBase.ts index bd7163493a..ea78e7b65b 100644 --- a/cli/src/base/StakingCommandBase.ts +++ b/cli/src/base/StakingCommandBase.ts @@ -1,6 +1,5 @@ import ExitCodes from '../ExitCodes' -import { AccountId } from '@joystream/types/common' -import { StakingLedger } from '@polkadot/types/interfaces' +import { StakingLedger, AccountId } from '@polkadot/types/interfaces' import AccountsCommandBase from './AccountsCommandBase' import { formatBalance } from '@polkadot/util' @@ -69,15 +68,15 @@ export default abstract class StakingCommandBase extends AccountsCommandBase { return await this.simplePrompt({ message, type: 'number' }) } - async checkElectionStatus() { - const electionStatus = await this.getApi().getEraElectionStatus() - if (electionStatus.isOpen === true) { - this.warn( - 'There is currently an ongoing election for new validator candidates. As such staking operations are not permitted. You need to wait' - ) - this.exit(ExitCodes.ActionCurrentlyUnavailable) - } - } + // async checkElectionStatus() { + // const electionStatus = await this.getApi().getEraElectionStatus() + // if (electionStatus.isOpen === true) { + // this.warn( + // 'There is currently an ongoing election for new validator candidates. As such staking operations are not permitted. You need to wait' + // ) + // this.exit(ExitCodes.ActionCurrentlyUnavailable) + // } + // } async getValidatorPrefs(commission: number | undefined): Promise { let validatorPrefs = { 'commission': 0 } diff --git a/cli/src/base/UploadCommandBase.ts b/cli/src/base/UploadCommandBase.ts index 67b3a06843..3252abf235 100644 --- a/cli/src/base/UploadCommandBase.ts +++ b/cli/src/base/UploadCommandBase.ts @@ -19,7 +19,10 @@ import path from 'path' import mimeTypes from 'mime-types' import { Assets } from '../schemas/typings/Assets.schema' import chalk from 'chalk' -import { DataObjectCreationParameters } from '@joystream/types/storage' +import { + PalletStorageDataObjectCreationParameters as DataObjectCreationParameters, + PalletContentStorageAssetsRecord as StorageAssets, +} from '@polkadot/types/lookup' import { createHash } from 'blake3-wasm' import * as multihash from 'multihashes' import { u8aToHex, formatBalance } from '@polkadot/util' @@ -27,7 +30,6 @@ import { KeyringPair } from '@polkadot/keyring/types' import FormData from 'form-data' import BN from 'bn.js' import { createType } from '@joystream/types' -import { StorageAssets } from '@joystream/types/content' ffmpeg.setFfprobePath(ffprobeInstaller.path) @@ -191,8 +193,8 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB } async generateDataObjectParameters(filePath: string): Promise { - return createType('DataObjectCreationParameters', { - size: this.getFileSize(filePath), + return createType('PalletStorageDataObjectCreationParameters', { + size_: this.getFileSize(filePath), ipfsContentId: await this.calculateFileHash(filePath), }) } @@ -251,8 +253,6 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB } async uploadAsset( - account: KeyringPair, - memberId: number, objectId: BN, bagId: string, filePath: string, @@ -274,9 +274,6 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB // cli.action.start('Waiting for the file to be processed...') }) const formData = new FormData() - formData.append('dataObjectId', objectId.toString()) - formData.append('storageBucketId', storageNodeInfo.bucketId) - formData.append('bagId', bagId) formData.append('file', fileStream, { filename: path.basename(filePath), filepath: filePath, @@ -285,6 +282,11 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB this.log(`Uploading object ${objectId.toString()} (${filePath})`) try { await axios.post(`${storageNodeInfo.apiEndpoint}/files`, formData, { + params: { + dataObjectId: objectId.toString(), + storageBucketId: storageNodeInfo.bucketId, + bagId, + }, maxBodyLength: Infinity, maxContentLength: Infinity, headers: { @@ -306,8 +308,6 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB } async uploadAssets( - account: KeyringPair, - memberId: number, bagId: string, assets: AssetToUpload[], inputFilePath: string, @@ -331,7 +331,7 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB const results = await Promise.all( assets.map(async (a) => { try { - await this.uploadAsset(account, memberId, a.dataObjectId, bagId, a.path, storageNodeInfo, multiBar) + await this.uploadAsset(a.dataObjectId, bagId, a.path, storageNodeInfo, multiBar) return true } catch (e) { errors.push([a.dataObjectId.toString(), e instanceof Error ? e.message : 'Unknown error']) @@ -339,33 +339,52 @@ export default abstract class UploadCommandBase extends ContentDirectoryCommandB } }) ) + multiBar.stop() errors.forEach(([objectId, message]) => this.warn(`Upload of object ${objectId} failed: ${message}`)) this.handleRejectedUploads(bagId, assets, results, inputFilePath, outputFilePostfix) - multiBar.stop() + if (errors.length) { + this.exit(ExitCodes.StorageNodeError) + } } - async prepareAssetsForExtrinsic(resolvedAssets: ResolvedAsset[]): Promise { + async prepareAssetsForExtrinsic( + resolvedAssets: ResolvedAsset[], + extrinsic?: 'createChannel' | 'createVideo' + ): Promise { const feePerMB = await this.getOriginalApi().query.storage.dataObjectPerMegabyteFee() - const { dataObjectDeletionPrize } = this.getOriginalApi().consts.storage + const dataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() + + const displayChannelOrVideoStateBloatBond = async (extrinsic?: 'createChannel' | 'createVideo') => { + const channelStateBloatBond = chalk.cyan(formatBalance(await this.getApi().channelStateBloatBond())) + const videoStateBloatBond = chalk.cyan(formatBalance(await this.getApi().videoStateBloatBond())) + + return extrinsic === 'createChannel' + ? `Channel state bloat bond: ${channelStateBloatBond} (recoverable on channel deletion)` + : extrinsic === 'createVideo' + ? `Video state bloat bond: ${videoStateBloatBond} (recoverable on video deletion)` + : '' + } + if (resolvedAssets.length) { const totalBytes = resolvedAssets .reduce((a, b) => { - return a.add(b.parameters.getField('size')) + return a.add(b.parameters.size_) }, new BN(0)) .toNumber() const totalStorageFee = feePerMB.muln(Math.ceil(totalBytes / 1024 / 1024)) - const totalDeletionPrize = dataObjectDeletionPrize.muln(resolvedAssets.length) + const totalStateBloatBond = dataObjectStateBloatBond.muln(resolvedAssets.length) await this.requireConfirmation( `Some additional costs will be associated with this operation:\n` + `Total data storage fee: ${chalk.cyan(formatBalance(totalStorageFee))}\n` + - `Total deletion prize: ${chalk.cyan( - formatBalance(totalDeletionPrize) + `Total state bloat bond: ${chalk.cyan( + formatBalance(totalStateBloatBond) )} (recoverable on data object(s) removal)\n` + + `${await displayChannelOrVideoStateBloatBond(extrinsic)}\n` + `Are you sure you want to continue?` ) - return createType('StorageAssets', { - expected_data_size_fee: feePerMB, - object_creation_list: resolvedAssets.map((a) => a.parameters), + return createType('PalletContentStorageAssetsRecord', { + expectedDataSizeFee: feePerMB, + objectCreationList: resolvedAssets.map((a) => a.parameters), }) } diff --git a/cli/src/base/WorkingGroupCommandBase.ts b/cli/src/base/WorkingGroupCommandBase.ts index 828c1d153b..3d43a8d457 100644 --- a/cli/src/base/WorkingGroupCommandBase.ts +++ b/cli/src/base/WorkingGroupCommandBase.ts @@ -3,7 +3,7 @@ import { flags } from '@oclif/command' import { WorkingGroups, GroupMember } from '../Types' import _ from 'lodash' import MembershipsCommandBase from './MembershipsCommandBase' -import { WorkerId } from '@joystream/types/working-group' +import { WorkerId } from '@joystream/types/primitives' /** * Abstract base class for commands relying on a specific working group context @@ -59,7 +59,7 @@ export default abstract class WorkingGroupCommandBase extends MembershipsCommand const availableGroupMemberContexts = allowedGroupMembers.filter((m) => expectedKeyType === 'Role' ? this.isKeyAvailable(m.roleAccount.toString()) - : this.isKeyAvailable(m.profile.membership.controller_account.toString()) + : this.isKeyAvailable(m.profile.membership.controllerAccount.toString()) ) if (!availableGroupMemberContexts.length) { diff --git a/cli/src/base/WorkingGroupsCommandBase.ts b/cli/src/base/WorkingGroupsCommandBase.ts index 0af31816f1..7495baa168 100644 --- a/cli/src/base/WorkingGroupsCommandBase.ts +++ b/cli/src/base/WorkingGroupsCommandBase.ts @@ -37,7 +37,7 @@ export default abstract class WorkingGroupsCommandBase extends WorkingGroupComma async getOpeningForLeadAction(id: number): Promise { const opening = await this.getApi().groupOpening(this.group, id) - if (!opening.type.isOfType('Regular')) { + if (!opening.type.isRegular) { this.error('A lead can only manage Regular openings!', { exit: ExitCodes.AccessDenied }) } @@ -51,7 +51,7 @@ export default abstract class WorkingGroupsCommandBase extends WorkingGroupComma const application = await this.getApi().groupApplication(this.group, id) const opening = await this.getApi().groupOpening(this.group, application.openingId) - if (!opening.type.isOfType('Regular')) { + if (!opening.type.isRegular) { this.error('A lead can only manage Regular opening applications!', { exit: ExitCodes.AccessDenied }) } diff --git a/cli/src/commands/advanced-transactions/constructSetCodeCall.ts b/cli/src/commands/advanced-transactions/constructSetCodeCall.ts new file mode 100644 index 0000000000..48d0b1ac05 --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructSetCodeCall.ts @@ -0,0 +1,89 @@ +import { flags } from '@oclif/command' +import { TxMethod, OptionsWithMeta } from '@substrate/txwrapper-core' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { ensureOutputFileIsWriteable, saveOutputJsonToFile } from '../../helpers/InputOutput' +import { blake2AsHex } from '@polkadot/util-crypto' +import { registry } from '@joystream/types' + +export default class CreateSetCodeCallCommand extends AdvancedTransactionsCommandBase { + static description = 'Construct a "system.setCode" call.' + static flags = { + wasmPath: flags.string({ + required: true, + description: 'The address that is performing the final call.', + }), + address: flags.string({ + required: true, + description: 'The address that is performing the final call.', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the call should be saved', + }), + codeOutput: flags.string({ + required: false, + description: 'Path to where the parsed wasm code shold be saved.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from creation to included on chain, in blocks before it becomes invalid.', + default: 64, + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async run(): Promise { + const { wasmPath, address, output, codeOutput, nonceIncrement, lifetime, tip } = + this.parse(CreateSetCodeCallCommand).flags + + ensureOutputFileIsWriteable(output) + + const code = await this.parseWasm(wasmPath) + + const outCode = { + code: `0x${code}`, + } + + const unsignedMethod: TxMethod = { + args: { + code: `0x${code}`, + }, + name: 'setCode', + pallet: 'system', + } + + const txInfo = await this.getTxInfo(address, unsignedMethod, nonceIncrement, lifetime, tip) + + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const call = unsigned.method + const callHash: string = blake2AsHex(call) + const unsignedTxData = { + call, + } + + saveOutputJsonToFile(output, unsignedTxData) + this.log(`Call has callhash ${callHash}`) + if (codeOutput) { + ensureOutputFileIsWriteable(codeOutput) + saveOutputJsonToFile(codeOutput, outCode) + } + } +} diff --git a/cli/src/commands/advanced-transactions/constructTxCall.ts b/cli/src/commands/advanced-transactions/constructTxCall.ts new file mode 100644 index 0000000000..25088f7e10 --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructTxCall.ts @@ -0,0 +1,88 @@ +import { flags } from '@oclif/command' +import { blake2AsHex } from '@polkadot/util-crypto' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { registry } from '@joystream/types' +import { OptionsWithMeta } from '@substrate/txwrapper-core' +import { ensureOutputFileIsWriteable, saveOutputJsonToFile } from '../../helpers/InputOutput' +import chalk from 'chalk' + +export default class ConstructTxCallCommand extends AdvancedTransactionsCommandBase { + static description = 'Construct a call that as argument for a transaction, or to wrap in another call.' + + static flags = { + address: flags.string({ + required: true, + description: 'The address that is performing the (final) transaction.', + }), + module: flags.string({ + required: true, + description: 'The module (a.k.a. section) of the extrinsic', + }), + method: flags.string({ + required: true, + description: 'The method of the extrinsic', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from creation to included on chain, in blocks before it becomes invalid.', + default: 64, + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async run(): Promise { + const { address, module, method, output, lifetime, tip, nonceIncrement } = this.parse(ConstructTxCallCommand).flags + + ensureOutputFileIsWriteable(output) + + const unsignedMethod = await this.promptForTxMethod(module, method) + + const txInfo = await this.getTxInfo(address, unsignedMethod, nonceIncrement, lifetime, tip) + + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const call = unsigned.method + const callHash: string = blake2AsHex(call) + + this.log(`The callhash is: ${callHash}`) + + if (call.length > 500) { + this.log(`Call too long to log to console - see output file`) + } else { + this.log(`Call: ${call}`) + } + + const outputJson = { + call, + callHash, + } + + try { + saveOutputJsonToFile(output, outputJson) + this.log(chalk.green(`Output successfully saved in: ${chalk.magentaBright(output)}!`)) + } catch (e) { + this.warn(`Could not save output to ${output}!`) + } + } +} diff --git a/cli/src/commands/advanced-transactions/constructUnsignedTx.ts b/cli/src/commands/advanced-transactions/constructUnsignedTx.ts new file mode 100644 index 0000000000..fd5201962b --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructUnsignedTx.ts @@ -0,0 +1,72 @@ +import { flags } from '@oclif/command' +import { blake2AsHex } from '@polkadot/util-crypto' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { registry } from '@joystream/types' +import { OptionsWithMeta } from '@substrate/txwrapper-core' +import { ensureOutputFileIsWriteable } from '../../helpers/InputOutput' + +export default class CreateUnsignedTxCommand extends AdvancedTransactionsCommandBase { + static description = 'Create a simple unsigned transaction, for signing offline.' + + static flags = { + address: flags.string({ + required: true, + description: 'The address that is performing the transaction.', + }), + module: flags.string({ + required: true, + description: 'The module of the extrinsic', + }), + method: flags.string({ + required: true, + description: 'The method of the extrinsic', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from constructed to included in a block, in blocks before it becomes invalid. Must be a power of two between 4 and 65536', + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async run(): Promise { + const { address, module, method, lifetime, tip, nonceIncrement, output } = this.parse(CreateUnsignedTxCommand).flags + + ensureOutputFileIsWriteable(output) + + const unsignedMethod = await this.promptForTxMethod(module, method) + + const txInfo = await this.getTxInfo(address, unsignedMethod, nonceIncrement, lifetime, tip) + + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const call = unsigned.method + const callHash: string = blake2AsHex(call) + const txData = { + call, + callHash, + } + + this.createTransactionReadyForSigning(unsigned, output, txData) + } +} diff --git a/cli/src/commands/advanced-transactions/constructUnsignedTxApproveMs.ts b/cli/src/commands/advanced-transactions/constructUnsignedTxApproveMs.ts new file mode 100644 index 0000000000..a6b6789666 --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructUnsignedTxApproveMs.ts @@ -0,0 +1,165 @@ +import { flags } from '@oclif/command' +import { blake2AsHex } from '@polkadot/util-crypto' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { Call } from '@polkadot/types/interfaces' +import { registry } from '@joystream/types' +import { OptionsWithMeta } from '@substrate/txwrapper-core' +import { ensureOutputFileIsWriteable, IOFlags } from '../../helpers/InputOutput' +import { formatBalance } from '@polkadot/util' + +export default class ConstructUnsignedTxApproveMsCommand extends AdvancedTransactionsCommandBase { + static description = 'Approve a transaction from a multisig account, as initiated by another signer.' + + static flags = { + input: IOFlags.input, + addressSigner: flags.string({ + required: true, + description: 'The address of the signer that is approving the multisig transaction.', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + inputCall: flags.string({ + required: false, + description: 'The hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + inputCallFile: flags.string({ + required: false, + description: + 'Path to a JSON file with the hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + addressMs: flags.string({ + required: false, + description: 'The address of the multisig that is performing the transaction.', + }), + others: flags.string({ + required: false, + description: + 'Comma separated list of the accounts (other than the addressSigner) who can approve this call. Ignored if "input" is provided.', + }), + threshold: flags.integer({ + description: + 'How many (m) of the n signatories (signer+others), are required to sign/approve the transaction. Ignored if "input" is provided.', + }), + timepointHeight: flags.integer({ + description: + 'Reference to the blockheight of the transaction that initiated the multisig transaction. Ignored if "input" is provided.', + }), + timepointIndex: flags.integer({ + description: 'Reference to the extrinsic index in the "timepointHeight block. Ignored if "input" is provided.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from constructed to included in a block, in blocks before it becomes invalid. Must be a power of two between 4 and 65536', + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async run(): Promise { + const { + input, + addressSigner, + output, + addressMs, + others, + inputCall, + inputCallFile, + threshold, + timepointHeight, + timepointIndex, + nonceIncrement, + lifetime, + tip, + } = this.parse(ConstructUnsignedTxApproveMsCommand).flags + + ensureOutputFileIsWriteable(output) + + const call = await this.getCallInput(inputCall, inputCallFile) + + const decodedCall: Call = this.createType('Call', call) + const fetchedWeight = await this.getWeight(decodedCall) + const callHash: string = blake2AsHex(call) + + const args = await this.getApproveMsInputs( + input, + threshold, + timepointHeight, + timepointIndex, + others, + callHash, + fetchedWeight + ) + const txMethod = { + args, + name: 'approveAsMulti', + pallet: 'multisig', + } + + const multiAddress = await this.getMsAddress( + parseInt(args.threshold.toString()), + args.otherSignatories as string[], + addressSigner + ) + + const accBalances = await this.getApi().getAccountsBalancesInfo([multiAddress]) + + if (addressMs) { + if (multiAddress !== addressMs) { + await this.requireConfirmation( + `The input sender account, addressMs: ${addressMs},` + + `does not match the account calculated from signer + others: ${multiAddress}` + + `Do you wish to continue?` + ) + } + } + + this.log( + `You are approving a multisig transaction from ${multiAddress}, with balances:\n` + + ` - free: ${formatBalance(accBalances[0].freeBalance)}\n` + + ` - available: ${formatBalance(accBalances[0].availableBalance)}\n` + + `If the multisig approves, the transaction will execute:\n` + + ` - module:method - ${decodedCall.section}:${decodedCall.method}\n` + ) + if (decodedCall.argsEntries.toString().length < 500) { + this.log(` - ${decodedCall.argsEntries.toString()}\n`) + } else { + this.log(`Decoded call is to too long for log. Check the output file.`) + } + + const multisigTxData = { + call, + callHash, + } + + const txInfo = await this.getTxInfo(addressSigner, txMethod, nonceIncrement, lifetime, tip) + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const unsignedCall = unsigned.method + const unsignedCallHash: string = blake2AsHex(unsignedCall) + const unsignedTxData = { + call: unsignedCall, + callHash: unsignedCallHash, + } + + await this.createTransactionReadyForSigning(unsigned, output, unsignedTxData, multisigTxData) + } +} diff --git a/cli/src/commands/advanced-transactions/constructUnsignedTxFinalApproveMs.ts b/cli/src/commands/advanced-transactions/constructUnsignedTxFinalApproveMs.ts new file mode 100644 index 0000000000..b9f82cb635 --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructUnsignedTxFinalApproveMs.ts @@ -0,0 +1,173 @@ +import { flags } from '@oclif/command' +import { blake2AsHex } from '@polkadot/util-crypto' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { Call } from '@polkadot/types/interfaces' +import { registry } from '@joystream/types' +import { OptionsWithMeta } from '@substrate/txwrapper-core' +import { ensureOutputFileIsWriteable, getInputJson, IOFlags } from '../../helpers/InputOutput' +import { MultiSigApproveAsMulti } from '@substrate/txwrapper-substrate/lib/methods/multisig' +import { formatBalance } from '@polkadot/util' +import ExitCodes from '../../ExitCodes' + +export default class ConstructUnsignedTxFinalApproveMsCommand extends AdvancedTransactionsCommandBase { + static description = 'Final approval of a transaction from a multisig account, as initiated by another signer.' + + static flags = { + input: IOFlags.input, + addressSigner: flags.string({ + required: true, + description: 'The address of the signer that is approving the multisig transaction.', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + inputCall: flags.string({ + required: false, + description: 'The hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + inputCallFile: flags.string({ + required: false, + description: + 'Path to a JSON file with the hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + addressMs: flags.string({ + required: false, + description: 'The address of the multisig that is performing the transaction.', + }), + others: flags.string({ + required: false, + description: + 'Comma separated list of the accounts (other than the addressSigner) who can approve this call. Ignored if "input" is provided.', + }), + threshold: flags.integer({ + description: + 'How many (m) of the n signatories (signer+others), are required to sign/approve the transaction. Ignored if "input" is provided.', + }), + timepointHeight: flags.integer({ + description: + 'Reference to the blockheight of the transaction that initiated the multisig transaction. Ignored if "input" is provided.', + }), + timepointIndex: flags.integer({ + description: 'Reference to the extrinsic index in the "timepointHeight block. Ignored if "input" is provided.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from constructed to included in a block, in blocks before it becomes invalid. Must be a power of two between 4 and 65536', + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async getInputFromFile(filePath: string): Promise { + return getInputJson(filePath) + } + + async run(): Promise { + const { + input, + addressSigner, + output, + addressMs, + others, + inputCall, + inputCallFile, + threshold, + timepointHeight, + timepointIndex, + nonceIncrement, + lifetime, + tip, + } = this.parse(ConstructUnsignedTxFinalApproveMsCommand).flags + + ensureOutputFileIsWriteable(output) + + const call = await this.getCallInput(inputCall, inputCallFile) + + const decodedCall: Call = this.createType('Call', call) + const fetchedWeight = await this.getWeight(decodedCall) + const callHash: string = blake2AsHex(call) + + const args = await this.getFinalMsInputs( + input, + threshold, + timepointHeight, + timepointIndex, + others, + call, + fetchedWeight + ) + const txMethod = { + args, + name: 'asMulti', + pallet: 'multisig', + } + let thresholddNumber: number + if (args.threshold) { + thresholddNumber = parseInt(args.threshold.toString()) + } else { + this.error('Missing required "threshold" input', { exit: ExitCodes.InvalidInput }) + } + + const multiAddress = await this.getMsAddress(thresholddNumber, args.otherSignatories as string[], addressSigner) + + const accBalances = await this.getApi().getAccountsBalancesInfo([multiAddress]) + + if (addressMs) { + if (multiAddress !== addressMs) { + await this.requireConfirmation( + `The input sender account, addressMs: ${addressMs},` + + `does not match the account calculated from signer + others: ${multiAddress}` + + `Do you wish to continue?` + ) + } + } + + this.log( + `You are approving (as the final signer required) a multisig transaction from ${multiAddress}, with balances:\n` + + ` - free: ${formatBalance(accBalances[0].freeBalance)}\n` + + ` - available: ${formatBalance(accBalances[0].availableBalance)}\n` + + `If the multisig approves, the transaction will execute:\n` + + ` - module:method - ${decodedCall.section}:${decodedCall.method}\n` + ) + if (decodedCall.argsEntries.toString().length < 500) { + this.log(` - ${decodedCall.argsEntries.toString()}\n`) + } else { + this.log(`Decoded call is to too long for log. Check the output file.`) + } + + const multisigTxData = { + call, + callHash, + } + + const txInfo = await this.getTxInfo(addressSigner, txMethod, nonceIncrement, lifetime, tip) + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const unsignedCall = unsigned.method + const unsignedCallHash: string = blake2AsHex(unsignedCall) + const unsignedTxData = { + call: unsignedCall, + callHash: unsignedCallHash, + } + + this.createTransactionReadyForSigning(unsigned, output, unsignedTxData, multisigTxData) + } +} diff --git a/cli/src/commands/advanced-transactions/constructUnsignedTxInitiateMs.ts b/cli/src/commands/advanced-transactions/constructUnsignedTxInitiateMs.ts new file mode 100644 index 0000000000..4ec99d970a --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructUnsignedTxInitiateMs.ts @@ -0,0 +1,151 @@ +import { flags } from '@oclif/command' +import { blake2AsHex } from '@polkadot/util-crypto' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { Call } from '@polkadot/types/interfaces' +import { registry } from '@joystream/types' +import { OptionsWithMeta, TxMethod } from '@substrate/txwrapper-core' +import { ensureOutputFileIsWriteable, getInputJson, IOFlags } from '../../helpers/InputOutput' +import { MultiSigApproveAsMulti } from '@substrate/txwrapper-substrate/lib/methods/multisig' +import { formatBalance } from '@polkadot/util' + +export default class ConstructUnsignedTxInitiateMsCommand extends AdvancedTransactionsCommandBase { + static description = 'Initiate a call (transaction) from a multisig account, as the first signer.' + + static flags = { + input: IOFlags.input, + addressSigner: flags.string({ + required: true, + description: 'The address of the signer that is initiating the multisig transaction.', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + addressMs: flags.string({ + required: false, + description: 'The address of the multisig that is performing the transaction.', + }), + inputCall: flags.string({ + required: false, + description: 'The hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + inputCallFile: flags.string({ + required: false, + description: + 'Path to a JSON file with the hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + others: flags.string({ + required: false, + description: + 'Comma separated list of the accounts (other than the addressSigner) who can approve this call. Ignored if "input" is provided.', + }), + threshold: flags.integer({ + description: + 'How many (m) of the n signatories (signer+others), are required to sign/approve the transaction. Ignored if "input" is provided.', + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from constructed to included in a block, in blocks before it becomes invalid. Must be a power of two between 4 and 65536', + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async getInputFromFile(filePath: string): Promise { + return getInputJson(filePath) + } + + async run(): Promise { + const { + input, + addressSigner, + output, + addressMs, + others, + inputCall, + inputCallFile, + threshold, + nonceIncrement, + lifetime, + tip, + } = this.parse(ConstructUnsignedTxInitiateMsCommand).flags + + ensureOutputFileIsWriteable(output) + + const call = await this.getCallInput(inputCall, inputCallFile) + + const decodedCall: Call = this.createType('Call', call) + const fetchedWeight = await this.getWeight(decodedCall) + const callHash: string = blake2AsHex(call) + + const args = await this.getInitMsInputs(input, threshold, others, callHash, fetchedWeight) + const multiAddress = await this.getMsAddress( + parseInt(args.threshold.toString()), + args.otherSignatories as string[], + addressSigner + ) + const accBalances = await this.getApi().getAccountsBalancesInfo([multiAddress]) + + if (addressMs) { + if (multiAddress !== addressMs) { + await this.requireConfirmation( + `The input sender account, addressMs: ${addressMs},` + + `does not match the account calculated from signer + others: ${multiAddress}` + + `Do you wish to continue?` + ) + } + } + + this.log( + `You are initiating a multisig transaction from ${multiAddress}, with balances:\n` + + ` - free: ${formatBalance(accBalances[0].freeBalance)}\n` + + ` - available: ${formatBalance(accBalances[0].availableBalance)}\n` + + `If the multisig approves, the transaction will execute:\n` + + ` - module:method - ${decodedCall.section}:${decodedCall.method}\n` + ) + if (decodedCall.argsEntries.toString().length < 500) { + this.log(` - ${decodedCall.argsEntries.toString()}\n`) + } else { + this.log(`Decoded call is to too long for log. Check the output file.`) + } + + const multisigTxData = { + call, + callHash, + } + + const txMethod: TxMethod = { + args, + name: 'approveAsMulti', + pallet: 'multisig', + } + const txInfo = await this.getTxInfo(addressSigner, txMethod, nonceIncrement, lifetime, tip) + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const unsignedCall = unsigned.method + const unsignedCallHash: string = blake2AsHex(unsignedCall) + const unsignedTxData = { + call: unsignedCall, + callHash: unsignedCallHash, + } + + await this.createTransactionReadyForSigning(unsigned, output, unsignedTxData, multisigTxData) + } +} diff --git a/cli/src/commands/advanced-transactions/constructWrappedTxCall.ts b/cli/src/commands/advanced-transactions/constructWrappedTxCall.ts new file mode 100644 index 0000000000..9a5059c1ed --- /dev/null +++ b/cli/src/commands/advanced-transactions/constructWrappedTxCall.ts @@ -0,0 +1,130 @@ +import { flags } from '@oclif/command' +import { TxMethod, OptionsWithMeta, Args } from '@substrate/txwrapper-core' +import AdvancedTransactionsCommandBase from '../../base/AdvancedTransactionsCommandBase' +import { ensureOutputFileIsWriteable, saveOutputJsonToFile } from '../../helpers/InputOutput' +import { blake2AsHex } from '@polkadot/util-crypto' +import { registry } from '@joystream/types' +import { ApiMethodArg } from '../../Types' +import chalk from 'chalk' + +export default class ConstructWrappedTxCallCommand extends AdvancedTransactionsCommandBase { + static description = 'Construct a wrapped transaction call.' + static flags = { + address: flags.string({ + required: true, + description: 'The address that is performing the (final) transaction.', + }), + module: flags.string({ + required: true, + description: 'The module (a.k.a. section) of the extrinsic', + }), + method: flags.string({ + required: true, + description: 'The method of the extrinsic', + }), + output: flags.string({ + char: 'o', + required: true, + description: 'Path to the file where the output JSON should be saved.', + }), + fullOutput: flags.string({ + required: false, + description: 'Path to the file where the full output should be saved', + }), + inputCall: flags.string({ + required: false, + description: 'The hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + inputCallFile: flags.string({ + required: false, + description: + 'Path to a JSON file with the hex-encoded call that is to be executed by the multisig if successfull.', + exactlyOne: ['inputCallFile', 'inputCall'], + }), + lifetime: flags.integer({ + required: false, + description: + 'Lifetime of the transaction, from creation to included on chain, in blocks before it becomes invalid.', + default: 64, + }), + tip: flags.integer({ + required: false, + default: 0, + description: 'Optional "tip" (in base value) for faster block inclusion.', + }), + nonceIncrement: flags.integer({ + required: false, + default: 0, + description: + 'If you are preparing multiple transactions from the samme account, before broadcasting them, you need to increase the nonce by 1 for each. This value will be added to the nonce read from the chain.', + }), + } + + async run(): Promise { + const { address, output, fullOutput, module, method, inputCall, inputCallFile, nonceIncrement, lifetime, tip } = + this.parse(ConstructWrappedTxCallCommand).flags + + ensureOutputFileIsWriteable(output) + + const callInput = await this.getCallInput(inputCall, inputCallFile) + + const getParams = await this.promptForExtrinsicArgs(module, method) + + const args: Args = {} + for (const param of getParams) { + if (param.argName === 'call') { + args[param.argName] = callInput + } else { + const value: ApiMethodArg = await this.promptForParam(param.argType) + args[param.argName] = value.toString() + } + } + + const unsignedMethod: TxMethod = { + args: args, + name: method, + pallet: module, + } + + const txInfo = await this.getTxInfo(address, unsignedMethod, nonceIncrement, lifetime, tip) + + const optionsWithMeta: OptionsWithMeta = { + metadataRpc: `0x${txInfo.metadataRpc.slice(2)}`, + registry, + } + + const unsigned = await this.getDefinedMethod(txInfo, optionsWithMeta) + + const call = unsigned.method + const callHash: string = blake2AsHex(call) + const unsignedTxData = { + call, + } + + try { + saveOutputJsonToFile(output, unsignedTxData) + this.log(chalk.green(`Output successfully saved in: ${chalk.magentaBright(output)}!`)) + } catch (e) { + this.warn(`Could not save output to ${output}!`) + } + + this.log(`The callhash is: ${callHash}`) + + if (call.length > 500) { + this.log(`Call too long to log to console - see output file`) + } else { + this.log(`Call: ${call}`) + } + + if (fullOutput) { + ensureOutputFileIsWriteable(fullOutput) + try { + saveOutputJsonToFile(fullOutput, unsigned) + this.log(chalk.green(`Output successfully saved in: ${chalk.magentaBright(fullOutput)}!`)) + } catch (e) { + this.warn(`Could not save output to ${fullOutput}!`) + } + } + } +} diff --git a/cli/src/commands/api/inspect.ts b/cli/src/commands/api/inspect.ts index e162fe61dc..e407a0c475 100644 --- a/cli/src/commands/api/inspect.ts +++ b/cli/src/commands/api/inspect.ts @@ -93,9 +93,6 @@ export default class ApiInspect extends ApiCommandBase { getQueryMethodParamsTypes(apiModule: string, apiMethod: string): string[] { const method = this.getUnaugmentedApi().query[apiModule][apiMethod] const { type } = method.creator.meta - if (type.isDoubleMap) { - return [type.asDoubleMap.key1.toString(), type.asDoubleMap.key2.toString()] - } if (type.isMap) { return [type.asMap.key.toString()] } @@ -109,9 +106,6 @@ export default class ApiInspect extends ApiCommandBase { meta: { type, modifier }, } = method.creator let typeName = type.toString() - if (type.isDoubleMap) { - typeName = type.asDoubleMap.value.toString() - } if (type.isMap) { typeName = type.asMap.value.toString() } diff --git a/cli/src/commands/content/addCuratorToGroup.ts b/cli/src/commands/content/addCuratorToGroup.ts index 1ba942e0e0..1447323fec 100644 --- a/cli/src/commands/content/addCuratorToGroup.ts +++ b/cli/src/commands/content/addCuratorToGroup.ts @@ -1,5 +1,8 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { createType, keysOf } from '@joystream/types' +import { flags } from '@oclif/command' +import { PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission } from '@polkadot/types/lookup' import chalk from 'chalk' +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' export default class AddCuratorToGroupCommand extends ContentDirectoryCommandBase { static description = 'Add Curator to existing Curator Group.' @@ -17,6 +20,15 @@ export default class AddCuratorToGroupCommand extends ContentDirectoryCommandBas ] static flags = { + permissions: flags.string({ + options: keysOf( + 'PalletContentIterableEnumsChannelActionPermission' + ), + char: 'p', + description: `List of permissions to associate with the curator, e.g. -p ManageChannelCollaborators UpdateVideoMetadata`, + required: false, + multiple: true, + }), ...ContentDirectoryCommandBase.flags, } @@ -24,6 +36,7 @@ export default class AddCuratorToGroupCommand extends ContentDirectoryCommandBas const lead = await this.getRequiredLeadContext() let { groupId, curatorId } = this.parse(AddCuratorToGroupCommand).args + const { permissions } = this.parse(AddCuratorToGroupCommand).flags if (groupId === undefined) { groupId = await this.promptForCuratorGroup() @@ -40,6 +53,10 @@ export default class AddCuratorToGroupCommand extends ContentDirectoryCommandBas await this.sendAndFollowNamedTx(await this.getDecodedPair(lead.roleAccount), 'content', 'addCuratorToGroup', [ groupId, curatorId, + createType( + 'BTreeSet', + (typeof permissions === 'string' ? [permissions] : permissions) as ChannelActionPermission['type'][] + ), ]) console.log( diff --git a/cli/src/commands/content/channel.ts b/cli/src/commands/content/channel.ts index 839f2db12a..c2e0b49822 100644 --- a/cli/src/commands/content/channel.ts +++ b/cli/src/commands/content/channel.ts @@ -1,7 +1,9 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { displayCollapsedRow, displayHeader, memberHandle } from '../../helpers/display' +import { displayCollapsedRow, displayHeader, displayTable } from '../../helpers/display' +import { PalletContentIterableEnumsChannelActionPermission } from '@polkadot/types/lookup' import { BTreeSet } from '@polkadot/types' -import { MemberId } from '@joystream/types/common' +import BN from 'bn.js' +import { formatBalance } from '@polkadot/util' export default class ChannelCommand extends ContentDirectoryCommandBase { static description = 'Show Channel details by id.' @@ -17,10 +19,20 @@ export default class ChannelCommand extends ContentDirectoryCommandBase { ...ContentDirectoryCommandBase.flags, } - async displayMembersSet(set: BTreeSet): Promise { - const ids = Array.from(set) - const members = await this.getApi().membersDetailsByIds(ids) - this.log(members.length ? members.map((m) => `${m.id} (${memberHandle(m)})`).join(', ') : 'NONE') + async displayCollaboratorsSet( + set: [BN, BTreeSet][] + ): Promise { + if (set.length > 0) { + displayTable( + set.map(([id, p]) => ({ + 'MemberId': id.toString(), + 'Permissions': p.toString(), + })), + 3 + ) + } else { + this.log('NONE') + } } async run(): Promise { @@ -30,20 +42,18 @@ export default class ChannelCommand extends ContentDirectoryCommandBase { displayCollapsedRow({ 'ID': channelId.toString(), 'Owner': JSON.stringify(channel.owner.toJSON()), - 'IsCensored': channel.is_censored.toString(), - 'RewardAccount': channel.reward_account.unwrapOr('NONE').toString(), + 'ChannelStateBloatBond': formatBalance(channel.channelStateBloatBond.amount), + 'DataObjects': channel.dataObjects.toString(), + 'PrivilegeLevel': channel.privilegeLevel.toString(), }) displayHeader(`Media`) displayCollapsedRow({ - 'NumberOfVideos': channel.num_videos.toNumber(), + 'NumberOfVideos': channel.numVideos.toNumber(), }) displayHeader(`Collaborators`) - await this.displayMembersSet(channel.collaborators) - - displayHeader('Moderators') - await this.displayMembersSet(channel.moderators) + await this.displayCollaboratorsSet([...channel.collaborators]) } else { this.error(`Channel not found by channel id: "${channelId}"!`) } diff --git a/cli/src/commands/content/channels.ts b/cli/src/commands/content/channels.ts index 252a83a217..4d15d21821 100644 --- a/cli/src/commands/content/channels.ts +++ b/cli/src/commands/content/channels.ts @@ -1,6 +1,7 @@ +import { formatBalance } from '@polkadot/util' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' // import chalk from 'chalk' -import { displayTable, shortAddress } from '../../helpers/display' +import { displayTable } from '../../helpers/display' export default class ChannelsCommand extends ContentDirectoryCommandBase { static description = 'List existing content directory channels.' @@ -17,10 +18,11 @@ export default class ChannelsCommand extends ContentDirectoryCommandBase { channels.map(([id, c]) => ({ 'ID': id.toString(), 'Owner': JSON.stringify(c.owner.toJSON()), - 'IsCensored': c.is_censored.toString(), - 'RewardAccount': c.reward_account ? shortAddress(c.reward_account.toString()) : 'NONE', 'Collaborators': c.collaborators.size, - 'Moderators': c.moderators.size, + 'ChannelStateBloatBond': formatBalance(c.channelStateBloatBond.amount), + 'DataObjects': c.dataObjects.toString(), + 'PrivilegeLevel': c.privilegeLevel.toString(), + 'NumberOfVideos': c.numVideos.toNumber(), })), 3 ) diff --git a/cli/src/commands/content/createChannel.ts b/cli/src/commands/content/createChannel.ts index 6bf7551fcd..dc57f19bda 100644 --- a/cli/src/commands/content/createChannel.ts +++ b/cli/src/commands/content/createChannel.ts @@ -1,15 +1,15 @@ -import { getInputJson } from '../../helpers/InputOutput' -import { ChannelCreationInputParameters } from '../../Types' -import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' -import { flags } from '@oclif/command' +import { ChannelMetadata } from '@joystream/metadata-protobuf' import { createType } from '@joystream/types' -import { ChannelCreationParameters } from '@joystream/types/content' -import { ChannelCreationInputSchema } from '../../schemas/ContentDirectory' +import { ChannelId } from '@joystream/types/primitives' +import { flags } from '@oclif/command' +import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import UploadCommandBase from '../../base/UploadCommandBase' -import chalk from 'chalk' -import { ChannelMetadata } from '@joystream/metadata-protobuf' -import { ChannelId } from '@joystream/types/common' +import { getInputJson } from '../../helpers/InputOutput' +import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' +import { ChannelCreationInputSchema } from '../../schemas/ContentDirectory' +import { ChannelCreationInputParameters } from '../../Types' export default class CreateChannelCommand extends UploadCommandBase { static description = 'Create channel inside content directory.' @@ -30,20 +30,18 @@ export default class CreateChannelCommand extends UploadCommandBase { if (!context) { context = await this.promptForChannelCreationContext() } - const [actor, address] = await this.getContentActor(context) - const { id: memberId } = await this.getRequiredMemberContext(true) + const [channelOwner, address] = await this.getChannelOwner(context) const keypair = await this.getDecodedPair(address) const channelInput = await getInputJson(input, ChannelCreationInputSchema) const meta = asValidatedMetadata(ChannelMetadata, channelInput) - const { collaborators, moderators, rewardAccount } = channelInput + const { collaborators } = channelInput if (collaborators) { - await this.validateMemberIdsSet(collaborators, 'collaborator') - } - - if (moderators) { - await this.validateMemberIdsSet(moderators, 'moderator') + await this.validateMemberIdsSet( + collaborators.map(({ memberId }) => memberId), + 'collaborator' + ) } const { coverPhotoPath, avatarPhotoPath } = channelInput @@ -54,43 +52,48 @@ export default class CreateChannelCommand extends UploadCommandBase { meta.coverPhoto = assetIndices.coverPhotoPath meta.avatarPhoto = assetIndices.avatarPhotoPath - // Preare and send the extrinsic - const assets = await this.prepareAssetsForExtrinsic(resolvedAssets) - const channelCreationParameters = createType( - 'ChannelCreationParameters', - { - assets, - meta: metadataToBytes(ChannelMetadata, meta), - collaborators, - moderators, - reward_account: rewardAccount, - } - ) + const expectedChannelStateBloatBond = await this.getApi().channelStateBloatBond() + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() + const storageBuckets = await this.getApi().selectStorageBucketsForNewChannel() + const distributionBuckets = await this.getApi().selectDistributionBucketsForNewChannel() - this.jsonPrettyPrint( - JSON.stringify({ assets: assets?.toJSON(), metadata: meta, collaborators, moderators, rewardAccount }) - ) + const assets = await this.prepareAssetsForExtrinsic(resolvedAssets, 'createChannel') + const channelCreationParameters = createType('PalletContentChannelCreationParametersRecord', { + assets, + expectedChannelStateBloatBond, + expectedDataObjectStateBloatBond, + storageBuckets, + distributionBuckets, + meta: metadataToBytes(ChannelMetadata, meta), + collaborators: new Map(collaborators?.map(({ memberId, permissions }) => [memberId, permissions])), + }) + + this.jsonPrettyPrint(JSON.stringify({ assets: assets?.toJSON(), metadata: meta, collaborators })) await this.requireConfirmation('Do you confirm the provided input?', true) const result = await this.sendAndFollowNamedTx(keypair, 'content', 'createChannel', [ - actor, + channelOwner, channelCreationParameters, ]) const channelCreatedEvent = this.getEvent(result, 'content', 'ChannelCreated') - const channelId: ChannelId = channelCreatedEvent.data[1] + const channelId: ChannelId = channelCreatedEvent.data[0] + const { dataObjects } = channelCreatedEvent.data[1] + this.log(chalk.green(`Channel with id ${chalk.cyanBright(channelId.toString())} successfully created!`)) this.output(channelId.toString()) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + if (dataObjects.size !== (assets?.objectCreationList.length || 0)) { + this.error('Unexpected number of channel assets in ChannelCreated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (dataObjects.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), `dynamic:channel:${channelId.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + [...dataObjects].map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), input ) } diff --git a/cli/src/commands/content/createChannelCategory.ts b/cli/src/commands/content/createChannelCategory.ts deleted file mode 100644 index 2667526445..0000000000 --- a/cli/src/commands/content/createChannelCategory.ts +++ /dev/null @@ -1,52 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { getInputJson } from '../../helpers/InputOutput' -import { ChannelCategoryInputParameters } from '../../Types' -import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' -import { flags } from '@oclif/command' -import { CreateInterface } from '@joystream/types' -import { ChannelCategoryCreationParameters, ChannelCategoryId } from '@joystream/types/content' -import { ChannelCategoryInputSchema } from '../../schemas/ContentDirectory' -import chalk from 'chalk' -import { ChannelCategoryMetadata } from '@joystream/metadata-protobuf' - -export default class CreateChannelCategoryCommand extends ContentDirectoryCommandBase { - static description = 'Create channel category inside content directory.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - input: flags.string({ - char: 'i', - required: true, - description: `Path to JSON file to use as input`, - }), - ...ContentDirectoryCommandBase.flags, - } - - async run(): Promise { - const { context, input } = this.parse(CreateChannelCategoryCommand).flags - - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - const channelCategoryInput = await getInputJson(input, ChannelCategoryInputSchema) - const meta = asValidatedMetadata(ChannelCategoryMetadata, channelCategoryInput) - - const channelCategoryCreationParameters: CreateInterface = { - meta: metadataToBytes(ChannelCategoryMetadata, meta), - } - - this.jsonPrettyPrint(JSON.stringify(channelCategoryInput)) - - await this.requireConfirmation('Do you confirm the provided input?', true) - - const result = await this.sendAndFollowNamedTx( - await this.getDecodedPair(address), - 'content', - 'createChannelCategory', - [actor, channelCategoryCreationParameters] - ) - - if (result) { - const categoryId: ChannelCategoryId = this.getEvent(result, 'content', 'ChannelCategoryCreated').data[0] - this.log(chalk.green(`ChannelCategory with id ${chalk.cyanBright(categoryId.toString())} successfully created!`)) - } - } -} diff --git a/cli/src/commands/content/createCuratorGroup.ts b/cli/src/commands/content/createCuratorGroup.ts index cc68f94e97..c439237de5 100644 --- a/cli/src/commands/content/createCuratorGroup.ts +++ b/cli/src/commands/content/createCuratorGroup.ts @@ -1,18 +1,53 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import chalk from 'chalk' +import { flags } from '@oclif/command' +import { ModerationPermissionsByLevelInputParameters } from '../../Types' +import { getInputJson } from '../../helpers/InputOutput' +import { ModerationPermissionsByLevelInputSchema } from '../../schemas/ContentDirectory' +import { createType } from '@joystream/types' + +const CURATOR_GROUP_CREATION_CONTEXTS = ['ACTIVE', 'INACTIVE'] as const export default class CreateCuratorGroupCommand extends ContentDirectoryCommandBase { static description = 'Create new Curator Group.' - static aliases = ['createCuratorGroup'] static flags = { + status: flags.enum({ + required: true, + description: `Status of newly created Curator Group: (${CURATOR_GROUP_CREATION_CONTEXTS.join('/')})`, + options: [...CURATOR_GROUP_CREATION_CONTEXTS], + }), + permissions: flags.string({ + char: 'p', + description: `Path to JSON file containing moderation permissions by channel privilege level to use as input`, + }), ...ContentDirectoryCommandBase.flags, } async run(): Promise { + const { status, permissions } = this.parse(CreateCuratorGroupCommand).flags const lead = await this.getRequiredLeadContext() + const keypair = await this.getDecodedPair(lead.roleAccount) - await this.buildAndSendExtrinsic(await this.getDecodedPair(lead.roleAccount), 'content', 'createCuratorGroup') + const moderationPermissionsByLevelInput = permissions + ? await getInputJson( + permissions, + ModerationPermissionsByLevelInputSchema + ) + : [] + const moderationPermissionsByLevel = createType( + 'BTreeMap>', + new Map( + moderationPermissionsByLevelInput.map(({ channelPrivilegeLevel, permissions }) => [ + channelPrivilegeLevel, + permissions, + ]) + ) + ) + await this.sendAndFollowNamedTx(keypair, 'content', 'createCuratorGroup', [ + status === 'ACTIVE', + moderationPermissionsByLevel, + ]) // TODO: Get id from event? console.log(chalk.green(`New group successfully created!`)) } diff --git a/cli/src/commands/content/createPlaylist.ts b/cli/src/commands/content/createPlaylist.ts index 1dab77d6d1..1eee6ac53e 100644 --- a/cli/src/commands/content/createPlaylist.ts +++ b/cli/src/commands/content/createPlaylist.ts @@ -1,6 +1,5 @@ import { ContentMetadata, PlaylistMetadata } from '@joystream/metadata-protobuf' import { createType } from '@joystream/types' -import { VideoCreationParameters, VideoId } from '@joystream/types/content' import { flags } from '@oclif/command' import chalk from 'chalk' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' @@ -9,6 +8,7 @@ import { getInputJson } from '../../helpers/InputOutput' import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' import { PlaylistInputSchema } from '../../schemas/ContentDirectory' import { PlaylistInputParameters } from '../../Types' +import ExitCodes from '../../ExitCodes' export default class CreatePlaylistCommand extends UploadCommandBase { static description = 'Create playlist under specific channel inside content directory.' @@ -33,7 +33,6 @@ export default class CreatePlaylistCommand extends UploadCommandBase { // Get context const channel = await this.getApi().channelById(channelId) const [actor, address] = await this.getChannelManagementActor(channel, context) - const { id: memberId } = await this.getRequiredMemberContext(true) const keypair = await this.getDecodedPair(address) // Get input from file @@ -47,16 +46,19 @@ export default class CreatePlaylistCommand extends UploadCommandBase { // Set assets indices in the metadata meta.thumbnailPhoto = assetIndices.thumbnailPhotoPath + const expectedVideoStateBloatBond = await this.getApi().videoStateBloatBond() + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() + // Preare and send the extrinsic const assets = await this.prepareAssetsForExtrinsic(resolvedAssets) - const playlistCreationParameters = createType( - 'VideoCreationParameters', - { - assets, - meta: metadataToBytes(ContentMetadata, { playlistMetadata: meta }), - enable_comments: enableComments, - } - ) + const playlistCreationParameters = createType('PalletContentVideoCreationParametersRecord', { + assets, + meta: metadataToBytes(ContentMetadata, { playlistMetadata: meta }), + expectedVideoStateBloatBond, + expectedDataObjectStateBloatBond, + autoIssueNft: null, + storageBucketsNumWitness: await this.getStorageBucketsNumWitness(channelId), + }) this.jsonPrettyPrint(JSON.stringify({ assets: assets?.toJSON(), metadata: meta, enableComments })) @@ -68,17 +70,19 @@ export default class CreatePlaylistCommand extends UploadCommandBase { playlistCreationParameters, ]) - const playlistId: VideoId = this.getEvent(result, 'content', 'VideoCreated').data[2] + const [, , playlistId, , dataObjects] = this.getEvent(result, 'content', 'VideoCreated').data this.log(chalk.green(`Playlist with id ${chalk.cyanBright(playlistId.toString())} successfully created!`)) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + if (dataObjects.size !== (assets?.objectCreationList.length || 0)) { + this.error('Unexpected number of channel assets in ChannelCreated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (dataObjects.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), `dynamic:channel:${channelId.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + [...dataObjects].map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), input ) } diff --git a/cli/src/commands/content/createVideo.ts b/cli/src/commands/content/createVideo.ts index 409875ea0b..13fbd4c605 100644 --- a/cli/src/commands/content/createVideo.ts +++ b/cli/src/commands/content/createVideo.ts @@ -4,14 +4,15 @@ import { asValidatedMetadata, metadataToBytes } from '../../helpers/serializatio import { VideoInputParameters, VideoFileMetadata } from '../../Types' import { createType } from '@joystream/types' import { flags } from '@oclif/command' -import { VideoCreationParameters, VideoId } from '@joystream/types/content' -import { IVideoMetadata, VideoMetadata } from '@joystream/metadata-protobuf' +import { ContentMetadata, IVideoMetadata, VideoMetadata } from '@joystream/metadata-protobuf' import { VideoInputSchema } from '../../schemas/ContentDirectory' import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission } from '@polkadot/types/lookup' export default class CreateVideoCommand extends UploadCommandBase { - static description = 'Create video under specific channel inside content directory.' + static description = 'Create video (non nft) under specific channel inside content directory.' static flags = { input: flags.string({ char: 'i', @@ -47,40 +48,74 @@ export default class CreateVideoCommand extends UploadCommandBase { // Get context const channel = await this.getApi().channelById(channelId) const [actor, address] = await this.getChannelManagementActor(channel, context) - const { id: memberId } = await this.getRequiredMemberContext(true) const keypair = await this.getDecodedPair(address) + // Ensure actor is authorized to create video + const requiredPermissions: ChannelActionPermission['type'][] = ['AddVideo'] + if (!(await this.hasRequiredChannelAgentPermissions(actor, channel, requiredPermissions))) { + this.error( + `Only channel owner or collaborator with ${requiredPermissions} permissions can add video to channel ${channelId}!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + // Get input from file const videoCreationParametersInput = await getInputJson(input, VideoInputSchema) let meta = asValidatedMetadata(VideoMetadata, videoCreationParametersInput) - const { enableComments } = videoCreationParametersInput - // Assets - const { videoPath, thumbnailPhotoPath } = videoCreationParametersInput - const [resolvedAssets, assetIndices] = await this.resolveAndValidateAssets({ videoPath, thumbnailPhotoPath }, input) + // Video assets + const { videoPath, thumbnailPhotoPath, subtitles } = videoCreationParametersInput + const [resolvedVideoAssets, videoAssetIndices] = await this.resolveAndValidateAssets( + { videoPath, thumbnailPhotoPath }, + input + ) // Set assets indices in the metadata - meta.video = assetIndices.videoPath - meta.thumbnailPhoto = assetIndices.thumbnailPhotoPath + meta.video = videoAssetIndices.videoPath + meta.thumbnailPhoto = videoAssetIndices.thumbnailPhotoPath + + // Subtitle assets + let subtitleAssetIndex = Object.values(videoAssetIndices).filter((v) => v !== undefined).length + const resolvedSubtitleAssets = ( + await Promise.all( + (subtitles || []).map(async (subtitleInputParameters, i) => { + const { subtitleAssetPath } = subtitleInputParameters + const [[resolvedAsset]] = await this.resolveAndValidateAssets({ subtitleAssetPath }, input) + // Set assets indices in the metadata + if (meta.subtitles && resolvedAsset) { + meta.subtitles[i].newAsset = subtitleAssetIndex++ + } + return resolvedAsset + }) + ) + ).filter((r) => r) // Try to get video file metadata - if (assetIndices.videoPath !== undefined) { - const videoFileMetadata = await this.getVideoFileMetadata(resolvedAssets[assetIndices.videoPath].path) + if (videoAssetIndices.videoPath !== undefined) { + const videoFileMetadata = await this.getVideoFileMetadata(resolvedVideoAssets[videoAssetIndices.videoPath].path) this.log('Video media file parameters established:', videoFileMetadata) meta = this.setVideoMetadataDefaults(meta, videoFileMetadata) } - // Preare and send the extrinsic - const assets = await this.prepareAssetsForExtrinsic(resolvedAssets) - const videoCreationParameters = createType( - 'VideoCreationParameters', - { - assets, - meta: metadataToBytes(VideoMetadata, meta), - enable_comments: enableComments, - } + // Prepare and send the extrinsic + const assets = await this.prepareAssetsForExtrinsic( + [...resolvedVideoAssets, ...resolvedSubtitleAssets], + 'createVideo' ) + const expectedVideoStateBloatBond = await this.getApi().videoStateBloatBond() + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() + + const videoCreationParameters = createType('PalletContentVideoCreationParametersRecord', { + assets, + meta: metadataToBytes(ContentMetadata, { videoMetadata: meta }), + expectedVideoStateBloatBond, + expectedDataObjectStateBloatBond, + autoIssueNft: null, + storageBucketsNumWitness: await this.getStorageBucketsNumWitness(channelId), + }) - this.jsonPrettyPrint(JSON.stringify({ assets: assets?.toJSON(), metadata: meta, enableComments })) + this.jsonPrettyPrint(JSON.stringify({ assets: assets?.toJSON(), metadata: meta })) await this.requireConfirmation('Do you confirm the provided input?', true) @@ -90,17 +125,22 @@ export default class CreateVideoCommand extends UploadCommandBase { videoCreationParameters, ]) - const videoId: VideoId = this.getEvent(result, 'content', 'VideoCreated').data[2] + const [, , videoId, , dataObjects] = this.getEvent(result, 'content', 'VideoCreated').data this.log(chalk.green(`Video with id ${chalk.cyanBright(videoId.toString())} successfully created!`)) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + if (dataObjects.size !== (assets?.objectCreationList.length || 0)) { + this.error('Unexpected number of video assets in VideoCreated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (dataObjects.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), `dynamic:channel:${channelId.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + [...dataObjects].map((id, index) => ({ + dataObjectId: id, + path: [...resolvedVideoAssets, ...resolvedSubtitleAssets][index].path, + })), input ) } diff --git a/cli/src/commands/content/createVideoCategory.ts b/cli/src/commands/content/createVideoCategory.ts index ea7d8645c7..1ef15b0713 100644 --- a/cli/src/commands/content/createVideoCategory.ts +++ b/cli/src/commands/content/createVideoCategory.ts @@ -1,52 +1,47 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { getInputJson } from '../../helpers/InputOutput' -import { VideoCategoryInputParameters } from '../../Types' -import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' -import { flags } from '@oclif/command' -import { CreateInterface } from '@joystream/types' -import { VideoCategoryCreationParameters, VideoCategoryId } from '@joystream/types/content' -import { VideoCategoryInputSchema } from '../../schemas/ContentDirectory' +import { metadataToString } from '../../helpers/serialization' import chalk from 'chalk' -import { VideoCategoryMetadata } from '@joystream/metadata-protobuf' +import { CreateVideoCategory, MemberRemarked } from '@joystream/metadata-protobuf' +import MemberRemarkCommand from '../membership/memberRemark' export default class CreateVideoCategoryCommand extends ContentDirectoryCommandBase { static description = 'Create video category inside content directory.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - input: flags.string({ - char: 'i', + static args = [ + { + name: 'name', required: true, - description: `Path to JSON file to use as input`, - }), + description: 'Video category name', + }, + { + name: 'description', + required: false, + description: 'Video category description', + }, + { + name: 'parentCategoryId', + required: false, + description: 'Parent category ID', + }, + ] + + static flags = { ...ContentDirectoryCommandBase.flags, } async run(): Promise { - const { context, input } = this.parse(CreateVideoCategoryCommand).flags - - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - const videoCategoryInput = await getInputJson(input, VideoCategoryInputSchema) - const meta = asValidatedMetadata(VideoCategoryMetadata, videoCategoryInput) - - const videoCategoryCreationParameters: CreateInterface = { - meta: metadataToBytes(VideoCategoryMetadata, meta), - } - - this.jsonPrettyPrint(JSON.stringify(videoCategoryInput)) + const { name, description, parentCategoryId } = this.parse(CreateVideoCategoryCommand).args - await this.requireConfirmation('Do you confirm the provided input?', true) + const meta = new MemberRemarked({ + createVideoCategory: new CreateVideoCategory({ + name, + description, + parentCategoryId, + }), + }) + const metaMessage = metadataToString(MemberRemarked, meta) - const result = await this.sendAndFollowNamedTx( - await this.getDecodedPair(address), - 'content', - 'createVideoCategory', - [actor, videoCategoryCreationParameters] - ) + await MemberRemarkCommand.run([metaMessage]) - if (result) { - const categoryId: VideoCategoryId = this.getEvent(result, 'content', 'VideoCategoryCreated').data[1] - this.log(chalk.green(`VideoCategory with id ${chalk.cyanBright(categoryId.toString())} successfully created!`)) - } + this.log(chalk.green(`Video category successfully created!`)) } } diff --git a/cli/src/commands/content/curatorGroup.ts b/cli/src/commands/content/curatorGroup.ts index a7e58a7cf3..90b6eb53d2 100644 --- a/cli/src/commands/content/curatorGroup.ts +++ b/cli/src/commands/content/curatorGroup.ts @@ -1,7 +1,7 @@ import { WorkingGroups } from '../../Types' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import chalk from 'chalk' -import { displayCollapsedRow, displayHeader, memberHandle } from '../../helpers/display' +import { displayCollapsedRow, displayHeader, displayTable, memberHandle } from '../../helpers/display' export default class CuratorGroupCommand extends ContentDirectoryCommandBase { static description = 'Show Curator Group details by ID.' @@ -19,14 +19,14 @@ export default class CuratorGroupCommand extends ContentDirectoryCommandBase { async run(): Promise { const { id } = this.parse(CuratorGroupCommand).args - const group = await this.getCuratorGroup(id) + const { active, curators, permissionsByLevel } = await this.getCuratorGroup(id) const members = (await this.getApi().groupMembers(WorkingGroups.Curators)).filter((curator) => - Array.from(group.curators).some((groupCurator) => groupCurator.eq(curator.workerId)) + Array.from(curators).some(([groupCurator]) => groupCurator.eq(curator.workerId)) ) displayCollapsedRow({ 'ID': id, - 'Status': group.active.valueOf() ? 'Active' : 'Inactive', + 'Status': active.valueOf() ? 'Active' : 'Inactive', }) displayHeader(`Group Members (${members.length})`) this.log( @@ -36,5 +36,19 @@ export default class CuratorGroupCommand extends ContentDirectoryCommandBase { ) .join(', ') ) + displayHeader(`Group Permissions (${[...permissionsByLevel].length})`) + this.log( + [...permissionsByLevel] + .map(([level, permissions]) => chalk.magentaBright(`Privilege Level: ${level}; (Permissions: ${permissions})`)) + .join('\n\n') + ) + displayHeader(`Permissions by Curator`) + displayTable( + [...curators].map(([id, permissions]) => ({ + 'ID': id.toString(), + 'Permissions': permissions.toString(), + })), + 5 + ) } } diff --git a/cli/src/commands/content/curatorGroups.ts b/cli/src/commands/content/curatorGroups.ts index 8324c8dcbe..21147a7fa4 100644 --- a/cli/src/commands/content/curatorGroups.ts +++ b/cli/src/commands/content/curatorGroups.ts @@ -1,5 +1,4 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -// import chalk from 'chalk' import { displayTable } from '../../helpers/display' export default class CuratorGroupsCommand extends ContentDirectoryCommandBase { @@ -17,6 +16,7 @@ export default class CuratorGroupsCommand extends ContentDirectoryCommandBase { 'ID': id.toString(), 'Status': group.active.valueOf() ? 'Active' : 'Inactive', 'Members': Array.from(group.curators).length, + 'Permissions': Array.from(group.permissionsByLevel).length, })), 5 ) diff --git a/cli/src/commands/content/deleteChannel.ts b/cli/src/commands/content/deleteChannel.ts index 3166493830..52aacae7d8 100644 --- a/cli/src/commands/content/deleteChannel.ts +++ b/cli/src/commands/content/deleteChannel.ts @@ -1,16 +1,16 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import { flags } from '@oclif/command' import chalk from 'chalk' -import { createType } from '@joystream/types' -import { BagId } from '@joystream/types/storage' import ExitCodes from '../../ExitCodes' import { formatBalance } from '@polkadot/util' import BN from 'bn.js' +import { PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission } from '@polkadot/types/lookup' export default class DeleteChannelCommand extends ContentDirectoryCommandBase { static description = 'Delete the channel and optionally all associated data objects.' static flags = { + context: ContentDirectoryCommandBase.channelManagementContextFlag, channelId: flags.integer({ char: 'c', required: true, @@ -24,54 +24,36 @@ export default class DeleteChannelCommand extends ContentDirectoryCommandBase { ...ContentDirectoryCommandBase.flags, } - async getDataObjectsInfoFromQueryNode(channelId: number): Promise<[string, BN][]> { - const dataObjects = await this.getQNApi().dataObjectsByBagId(`dynamic:channel:${channelId}`) - - if (dataObjects.length) { - this.log('Following data objects are still associated with the channel:') - dataObjects.forEach((o) => { - let parentStr = '' - if ('video' in o.type && o.type.video) { - parentStr = ` (video: ${o.type.video.id})` - } - this.log(`- ${o.id} - ${o.type.__typename}${parentStr}`) - }) - } - - return dataObjects.map((o) => [o.id, new BN(o.deletionPrize)]) - } - - async getDataObjectsInfoFromChain(channelId: number): Promise<[string, BN][]> { - const dataObjects = await this.getApi().dataObjectsInBag( - createType('BagId', { Dynamic: { Channel: channelId } }) - ) - - if (dataObjects.length) { - const dataObjectIds = dataObjects.map(([id]) => id.toString()) - this.log(`Following data objects are still associated with the channel: ${dataObjectIds.join(', ')}`) - } - - return dataObjects.map(([id, o]) => [id.toString(), o.deletion_prize]) - } - async run(): Promise { - const { - flags: { channelId, force }, - } = this.parse(DeleteChannelCommand) + const { context, channelId, force } = this.parse(DeleteChannelCommand).flags // Context const channel = await this.getApi().channelById(channelId) - const [actor, address] = await this.getChannelOwnerActor(channel) + const [actor, address] = await this.getChannelManagementActor(channel, context) - if (channel.num_videos.toNumber()) { + const dataObjectsInfo = this.isQueryNodeUriSet() + ? await this.getDataObjectsInfoFromQueryNode(channelId) + : await this.getDataObjectsInfoFromChain(channelId) + + // Ensure actor is authorized to perform channel deletion + const requiredPermissions: ChannelActionPermission['type'][] = dataObjectsInfo.length + ? ['DeleteChannel', 'ManageNonVideoChannelAssets'] + : ['DeleteChannel'] + if (!(await this.hasRequiredChannelAgentPermissions(actor, channel, requiredPermissions))) { this.error( - `This channel still has ${channel.num_videos.toNumber()} associated video(s)!\n` + - `Delete the videos first using ${chalk.magentaBright('content:deleteVideo')} command` + `Only channelOwner or collaborator with ${requiredPermissions} permissions can perform this deletion!`, + { + exit: ExitCodes.AccessDenied, + } ) } - const dataObjectsInfo = this.isQueryNodeUriSet() - ? await this.getDataObjectsInfoFromQueryNode(channelId) - : await this.getDataObjectsInfoFromChain(channelId) + if (channel.numVideos.toNumber()) { + this.error( + `This channel still has + ${channel.numVideos.toNumber()} associated video(s)!\n` + + `Delete the videos first using ${chalk.magentaBright('content:deleteVideo')} command` + ) + } if (dataObjectsInfo.length) { if (!force) { @@ -79,11 +61,16 @@ export default class DeleteChannelCommand extends ContentDirectoryCommandBase { exit: ExitCodes.InvalidInput, }) } - const deletionPrize = dataObjectsInfo.reduce((sum, [, prize]) => sum.add(prize), new BN(0)) + const dataObjectsStateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) this.log( - `Data objects deletion prize of ${chalk.cyanBright( - formatBalance(deletionPrize) - )} will be transferred to ${chalk.magentaBright(address)}` + `Channel state bloat bond of ${chalk.cyanBright( + formatBalance(channel.channelStateBloatBond.amount) + )} will be transferred to ${chalk.magentaBright( + channel.channelStateBloatBond.repaymentRestrictedTo.unwrapOr(address).toString() + )}\n` + + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(dataObjectsStateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` ) } @@ -96,6 +83,7 @@ export default class DeleteChannelCommand extends ContentDirectoryCommandBase { await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteChannel', [ actor, channelId, + await this.getChannelBagWitness(channelId), force ? dataObjectsInfo.length : 0, ]) } diff --git a/cli/src/commands/content/deleteChannelAsModerator.ts b/cli/src/commands/content/deleteChannelAsModerator.ts new file mode 100644 index 0000000000..700f4b25dc --- /dev/null +++ b/cli/src/commands/content/deleteChannelAsModerator.ts @@ -0,0 +1,88 @@ +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { flags } from '@oclif/command' +import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' +import { formatBalance } from '@polkadot/util' +import BN from 'bn.js' + +export default class DeleteChannelAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Delete the channel and optionally all associated data objects.' + + static flags = { + channelId: flags.integer({ + char: 'c', + required: true, + description: 'ID of the Channel', + }), + force: flags.boolean({ + char: 'f', + default: false, + description: 'Force-remove all associated channel data objects', + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'Reason of deleting the channel by moderator', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async run(): Promise { + const { channelId, force, rationale, context } = this.parse(DeleteChannelAsModeratorCommand).flags + // Context + const channel = await this.getApi().channelById(channelId) + const [actor, address] = await this.getModerationActionActor(context) + + // Ensure moderator has required permission + if (!(await this.isModeratorWithRequiredPermission(actor, channel.privilegeLevel, 'DeleteChannel'))) { + this.error(`Only content lead or curator with "DeleteChannel" permission can delete channel ${channelId}!`, { + exit: ExitCodes.AccessDenied, + }) + } + + if (channel.numVideos.toNumber()) { + this.error( + `This channel still has ${channel.numVideos.toNumber()} associated video(s)!\n` + + `Delete the videos first using ${chalk.magentaBright('content:deleteVideo')} command` + ) + } + + const dataObjectsInfo = this.isQueryNodeUriSet() + ? await this.getDataObjectsInfoFromQueryNode(channelId) + : await this.getDataObjectsInfoFromChain(channelId) + + if (dataObjectsInfo.length) { + if (!force) { + this.error(`Cannot remove associated data objects unless ${chalk.magentaBright('--force')} flag is used`, { + exit: ExitCodes.InvalidInput, + }) + } + const stateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) + this.log( + `Channel state bloat bond of ${chalk.cyanBright( + formatBalance(channel.channelStateBloatBond.amount) + )} will be transferred to ${chalk.magentaBright( + channel.channelStateBloatBond.repaymentRestrictedTo.unwrapOr(address).toString() + )}\n` + + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(stateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` + ) + } + + await this.requireConfirmation( + `Are you sure you want to remove channel ${chalk.magentaBright(channelId.toString())}${ + force ? ' and all associated data objects' : '' + }?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteChannelAsModerator', [ + actor, + channelId, + await this.getChannelBagWitness(channelId), + force ? dataObjectsInfo.length : 0, + rationale, + ]) + } +} diff --git a/cli/src/commands/content/deleteChannelAssetsAsModerator.ts b/cli/src/commands/content/deleteChannelAssetsAsModerator.ts new file mode 100644 index 0000000000..f4e30ebeff --- /dev/null +++ b/cli/src/commands/content/deleteChannelAssetsAsModerator.ts @@ -0,0 +1,90 @@ +import { createType } from '@joystream/types' +import { flags } from '@oclif/command' +import { formatBalance } from '@polkadot/util' +import chalk from 'chalk' +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import ExitCodes from '../../ExitCodes' +import BN from 'bn.js' + +export default class DeleteChannelAssetsAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Delete the channel assets.' + + protected requiresQueryNode = true + + static flags = { + channelId: flags.integer({ + char: 'c', + required: true, + description: 'ID of the Channel', + }), + assetIds: flags.integer({ + char: 'a', + description: `List of data object IDs to delete`, + required: true, + multiple: true, + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'Reason for removing the channel assets by moderator', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async getDataObjectsInfo(channelId: number, assetIds: number[]): Promise<[string, BN][]> { + const dataObjects = await this.getQNApi().dataObjectsByChannelId(channelId.toString()) + + return assetIds.map((id) => { + const dataObject = dataObjects.find((o) => o.id === id.toString()) + if (dataObject) { + return [dataObject.id, new BN(dataObject.stateBloatBond)] + } + + this.error(`Data object ${id} is not associated with channel ${channelId}`, { + exit: ExitCodes.InvalidInput, + }) + }) + } + + async run(): Promise { + const { channelId, assetIds, rationale, context } = this.parse(DeleteChannelAssetsAsModeratorCommand).flags + // Context + const [actor, address] = await this.getModerationActionActor(context) + // ensure channel exists + const { privilegeLevel } = await this.getApi().channelById(channelId) + + // Ensure moderator has required permission + if (!(await this.isModeratorWithRequiredPermission(actor, privilegeLevel, 'DeleteNonVideoChannelAssets'))) { + this.error( + `Only content lead or curator with "DeleteNonVideoChannelAssets" permission can delete channel ${channelId} assets!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + + const dataObjectsInfo = await this.getDataObjectsInfo(channelId, assetIds) + const stateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) + this.log( + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(stateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` + ) + + await this.requireConfirmation( + `Are you sure you want to remove assets ${assetIds} associated with channel ${chalk.magentaBright(channelId)}?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteChannelAssetsAsModerator', [ + actor, + channelId, + createType( + 'BTreeSet', + dataObjectsInfo.map(([id]) => Number(id)) + ), + await this.getStorageBucketsNumWitness(channelId), + rationale, + ]) + } +} diff --git a/cli/src/commands/content/deleteChannelCategory.ts b/cli/src/commands/content/deleteChannelCategory.ts deleted file mode 100644 index 7af3cb5945..0000000000 --- a/cli/src/commands/content/deleteChannelCategory.ts +++ /dev/null @@ -1,36 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' - -export default class DeleteChannelCategoryCommand extends ContentDirectoryCommandBase { - static description = 'Delete channel category.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'channelCategoryId', - required: true, - description: 'ID of the Channel Category', - }, - ] - - async run(): Promise { - const { context } = this.parse(DeleteChannelCategoryCommand).flags - - const { channelCategoryId } = this.parse(DeleteChannelCategoryCommand).args - - const channelCategoryIds = await this.getApi().channelCategoryIds() - - if (channelCategoryIds.some((id) => id.toString() === channelCategoryId)) { - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteChannelCategory', [ - actor, - channelCategoryId, - ]) - } else { - this.error('Channel category under given id does not exist...') - } - } -} diff --git a/cli/src/commands/content/deletePlaylist.ts b/cli/src/commands/content/deletePlaylist.ts index 2885e8ffaf..ae68bafa45 100644 --- a/cli/src/commands/content/deletePlaylist.ts +++ b/cli/src/commands/content/deletePlaylist.ts @@ -36,7 +36,7 @@ export default class DeletePlaylistCommand extends ContentDirectoryCommandBase { }) } - return dataObjects.map((o) => [o.id, new BN(o.deletionPrize)]) + return dataObjects.map((o) => [o.id, new BN(o.stateBloatBond)]) } async run(): Promise { @@ -45,7 +45,7 @@ export default class DeletePlaylistCommand extends ContentDirectoryCommandBase { } = this.parse(DeletePlaylistCommand) // Context const playlist = await this.getApi().videoById(playlistId) - const channel = await this.getApi().channelById(playlist.in_channel.toNumber()) + const channel = await this.getApi().channelById(playlist.inChannel.toNumber()) const [actor, address] = await this.getChannelManagementActor(channel, context) const dataObjectsInfo = await this.getDataObjectsInfo(playlistId) @@ -72,10 +72,8 @@ export default class DeletePlaylistCommand extends ContentDirectoryCommandBase { await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteVideo', [ actor, playlistId, - createType( - 'BTreeSet', - dataObjectsInfo.map(([id]) => id) - ), + createType('u64', dataObjectsInfo.length), + createType('Option', await this.getStorageBucketsNumWitness(playlist.inChannel)), ]) } } diff --git a/cli/src/commands/content/deleteVideo.ts b/cli/src/commands/content/deleteVideo.ts index 7e5d424e0c..63937b8934 100644 --- a/cli/src/commands/content/deleteVideo.ts +++ b/cli/src/commands/content/deleteVideo.ts @@ -1,5 +1,6 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import { flags } from '@oclif/command' +import { PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission } from '@polkadot/types/lookup' import BN from 'bn.js' import chalk from 'chalk' import { formatBalance } from '@polkadot/util' @@ -36,30 +37,48 @@ export default class DeleteVideoCommand extends ContentDirectoryCommandBase { }) } - return dataObjects.map((o) => [o.id, new BN(o.deletionPrize)]) + return dataObjects.map((o) => [o.id, new BN(o.stateBloatBond)]) } async run(): Promise { - const { - flags: { videoId, force, context }, - } = this.parse(DeleteVideoCommand) - // Context + const { videoId, force, context } = this.parse(DeleteVideoCommand).flags + // Ensure video exists const video = await this.getApi().videoById(videoId) - const channel = await this.getApi().channelById(video.in_channel.toNumber()) + const channel = await this.getApi().channelById(video.inChannel.toNumber()) + // Context const [actor, address] = await this.getChannelManagementActor(channel, context) const dataObjectsInfo = await this.getDataObjectsInfo(videoId) + + // Ensure actor is authorized to perform video deletion + const requiredPermissions: ChannelActionPermission['type'][] = dataObjectsInfo.length + ? ['DeleteVideo', 'ManageVideoAssets'] + : ['DeleteVideo'] + if (!(await this.hasRequiredChannelAgentPermissions(actor, channel, requiredPermissions))) { + this.error( + `Only channel owner or collaborator with ${requiredPermissions} permissions can perform this deletion!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + if (dataObjectsInfo.length) { if (!force) { this.error(`Cannot remove associated data objects unless ${chalk.magentaBright('--force')} flag is used`, { exit: ExitCodes.InvalidInput, }) } - const deletionPrize = dataObjectsInfo.reduce((sum, [, prize]) => sum.add(prize), new BN(0)) + const dataObjectsStateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) this.log( - `Data objects deletion prize of ${chalk.cyanBright( - formatBalance(deletionPrize) - )} will be transferred to ${chalk.magentaBright(address)}` + `Video state bloat bond of ${chalk.cyanBright( + formatBalance(video.videoStateBloatBond.amount) + )} will be transferred to ${chalk.magentaBright( + video.videoStateBloatBond.repaymentRestrictedTo.unwrapOr(address).toString() + )}\n` + + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(dataObjectsStateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` ) } @@ -72,10 +91,8 @@ export default class DeleteVideoCommand extends ContentDirectoryCommandBase { await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteVideo', [ actor, videoId, - createType( - 'BTreeSet', - dataObjectsInfo.map(([id]) => id) - ), + createType('u64', dataObjectsInfo.length), + createType('Option', await this.getStorageBucketsNumWitness(video.inChannel)), ]) } } diff --git a/cli/src/commands/content/deleteVideoAsModerator.ts b/cli/src/commands/content/deleteVideoAsModerator.ts new file mode 100644 index 0000000000..c2230e46e4 --- /dev/null +++ b/cli/src/commands/content/deleteVideoAsModerator.ts @@ -0,0 +1,98 @@ +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { flags } from '@oclif/command' +import BN from 'bn.js' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' +import { createType } from '@joystream/types' +import ExitCodes from '../../ExitCodes' + +export default class DeleteVideoAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Delete the video and optionally all associated data objects.' + + protected requiresQueryNode = true + + static flags = { + videoId: flags.integer({ + char: 'v', + required: true, + description: 'ID of the Video', + }), + force: flags.boolean({ + char: 'f', + default: false, + description: 'Force-remove all associated video data objects', + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'reason of deleting the video by moderator', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async getDataObjectsInfo(videoId: number): Promise<[string, BN][]> { + const dataObjects = await this.getQNApi().dataObjectsByVideoId(videoId.toString()) + + if (dataObjects.length) { + this.log('Following data objects are still associated with the video:') + dataObjects.forEach((o) => { + this.log(`${o.id} - ${o.type.__typename}`) + }) + } + + return dataObjects.map((o) => [o.id, new BN(o.stateBloatBond)]) + } + + async run(): Promise { + const { + flags: { videoId, force, rationale, context }, + } = this.parse(DeleteVideoAsModeratorCommand) + // Context + const [actor, address] = await this.getModerationActionActor(context) + // ensure video exists + const { inChannel, videoStateBloatBond } = await this.getApi().videoById(videoId) + const { privilegeLevel } = await this.getApi().channelById(inChannel) + + // Ensure moderator has required permission + if (!(await this.isModeratorWithRequiredPermission(actor, privilegeLevel, 'DeleteVideo'))) { + this.error(`Only content lead or curator with "DeleteVideo" permission can delete video ${videoId}!`, { + exit: ExitCodes.AccessDenied, + }) + } + + const dataObjectsInfo = await this.getDataObjectsInfo(videoId) + if (dataObjectsInfo.length) { + if (!force) { + this.error(`Cannot remove associated data objects unless ${chalk.magentaBright('--force')} flag is used`, { + exit: ExitCodes.InvalidInput, + }) + } + const stateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) + this.log( + `Video state bloat bond of ${chalk.cyanBright( + formatBalance(videoStateBloatBond.amount) + )} will be transferred to ${chalk.magentaBright( + videoStateBloatBond.repaymentRestrictedTo.unwrapOr(address).toString() + )}\n` + + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(stateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` + ) + } + + await this.requireConfirmation( + `Are you sure you want to remove video ${chalk.magentaBright(videoId)}${ + force ? ' and all associated data objects' : '' + }?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteVideoAsModerator', [ + actor, + videoId, + createType('Option', await this.getStorageBucketsNumWitness(inChannel)), + dataObjectsInfo.length, + rationale, + ]) + } +} diff --git a/cli/src/commands/content/deleteVideoAssetsAsModerator.ts b/cli/src/commands/content/deleteVideoAssetsAsModerator.ts new file mode 100644 index 0000000000..4d806251bd --- /dev/null +++ b/cli/src/commands/content/deleteVideoAssetsAsModerator.ts @@ -0,0 +1,93 @@ +import { createType } from '@joystream/types' +import { flags } from '@oclif/command' +import { formatBalance } from '@polkadot/util' +import chalk from 'chalk' +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import ExitCodes from '../../ExitCodes' +import BN from 'bn.js' + +export default class DeleteVideoAssetsAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Delete the video assets.' + + protected requiresQueryNode = true + + static flags = { + videoId: flags.integer({ + char: 'v', + required: true, + description: 'ID of the Video', + }), + assetIds: flags.string({ + char: 'a', + description: `List of data object IDs to delete`, + required: true, + multiple: true, + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'Reason for removing the video assets by moderator', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async getDataObjectsInfo(videoId: number, assetIds: string[]): Promise<[string, BN][]> { + const dataObjects = await this.getQNApi().dataObjectsByVideoId(videoId.toString()) + + return assetIds.map((id) => { + const dataObject = dataObjects.find((o) => o.id === id) + if (dataObject) { + return [dataObject.id, new BN(dataObject.stateBloatBond)] + } + + this.error(`Data object ${id} is not associated with video ${videoId}`, { + exit: ExitCodes.InvalidInput, + }) + }) + } + + async run(): Promise { + const { videoId, assetIds, rationale, context } = this.parse(DeleteVideoAssetsAsModeratorCommand).flags + // Context + const [actor, address] = await this.getModerationActionActor(context) + // ensure video exists + const { inChannel, nftStatus } = await this.getApi().videoById(videoId) + const { privilegeLevel } = await this.getApi().channelById(inChannel) + + // Ensure moderator has required permission + if ( + !(await this.isModeratorWithRequiredPermission(actor, privilegeLevel, { DeleteVideoAssets: nftStatus.isSome })) + ) { + this.error( + `Only content lead or curator with DeleteVideoAssets(${nftStatus.isSome}) permission can delete video ${videoId} assets!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + + const dataObjectsInfo = await this.getDataObjectsInfo(videoId, assetIds) + const stateBloatBond = dataObjectsInfo.reduce((sum, [, bloatBond]) => sum.add(bloatBond), new BN(0)) + this.log( + `Data objects state bloat bond of ${chalk.cyanBright( + formatBalance(stateBloatBond) + )} will be repaid with accordance to the bloat bond policy.` + ) + + await this.requireConfirmation( + `Are you sure you want to remove assets ${assetIds} associated with video ${chalk.magentaBright(videoId)}?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteVideoAssetsAsModerator', [ + actor, + videoId, + await this.getStorageBucketsNumWitness(inChannel), + createType( + 'BTreeSet', + dataObjectsInfo.map(([id]) => Number(id)) + ), + rationale, + ]) + } +} diff --git a/cli/src/commands/content/deleteVideoCategory.ts b/cli/src/commands/content/deleteVideoCategory.ts deleted file mode 100644 index a1098f2c03..0000000000 --- a/cli/src/commands/content/deleteVideoCategory.ts +++ /dev/null @@ -1,36 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' - -export default class DeleteVideoCategoryCommand extends ContentDirectoryCommandBase { - static description = 'Delete video category.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'videoCategoryId', - required: true, - description: 'ID of the Video Category', - }, - ] - - async run(): Promise { - const { context } = this.parse(DeleteVideoCategoryCommand).flags - - const { videoCategoryId } = this.parse(DeleteVideoCategoryCommand).args - - const videoCategoryIds = await this.getApi().videoCategoryIds() - - if (videoCategoryIds.some((id) => id.toString() === videoCategoryId)) { - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'deleteVideoCategory', [ - actor, - videoCategoryId, - ]) - } else { - this.error('Video category under given id does not exist...') - } - } -} diff --git a/cli/src/commands/content/removeChannelAssets.ts b/cli/src/commands/content/removeChannelAssets.ts index c7e80ca81f..9f17deb769 100644 --- a/cli/src/commands/content/removeChannelAssets.ts +++ b/cli/src/commands/content/removeChannelAssets.ts @@ -35,7 +35,7 @@ export default class RemoveChannelAssetsCommand extends ContentDirectoryCommandB await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateChannel', [ actor, channelId, - { assets_to_remove: createType('BTreeSet', objectIds) }, + { assetsToRemove: createType('BTreeSet', objectIds) }, ]) } } diff --git a/cli/src/commands/content/removeCuratorFromGroup.ts b/cli/src/commands/content/removeCuratorFromGroup.ts index de15e26145..056dbc43b8 100644 --- a/cli/src/commands/content/removeCuratorFromGroup.ts +++ b/cli/src/commands/content/removeCuratorFromGroup.ts @@ -30,7 +30,7 @@ export default class RemoveCuratorFromGroupCommand extends ContentDirectoryComma } const group = await this.getCuratorGroup(groupId) - const groupCuratorIds = Array.from(group.curators).map((id) => id.toNumber()) + const groupCuratorIds = Array.from(group.curators).map(([id]) => id.toNumber()) if (curatorId === undefined) { curatorId = await this.promptForCurator('Choose a Curator to remove', groupCuratorIds) diff --git a/cli/src/commands/content/reuploadAssets.ts b/cli/src/commands/content/reuploadAssets.ts index 8244776cc8..360f32dc67 100644 --- a/cli/src/commands/content/reuploadAssets.ts +++ b/cli/src/commands/content/reuploadAssets.ts @@ -20,9 +20,6 @@ export default class ReuploadVideoAssetsCommand extends UploadCommandBase { async run(): Promise { const { input } = this.parse(ReuploadVideoAssetsCommand).flags - // Get context - const { id: memberId, membership } = await this.getRequiredMemberContext() - // Get input from file const inputData = await getInputJson(input, AssetsSchema) const { bagId } = inputData @@ -32,13 +29,6 @@ export default class ReuploadVideoAssetsCommand extends UploadCommandBase { })) // Upload assets - await this.uploadAssets( - await this.getDecodedPair(membership.controller_account), - memberId.toNumber(), - bagId, - inputAssets, - input, - '' - ) + await this.uploadAssets(bagId, inputAssets, input, '') } } diff --git a/cli/src/commands/content/setChannelVisibilityAsModerator.ts b/cli/src/commands/content/setChannelVisibilityAsModerator.ts new file mode 100644 index 0000000000..4ef710c291 --- /dev/null +++ b/cli/src/commands/content/setChannelVisibilityAsModerator.ts @@ -0,0 +1,61 @@ +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { flags } from '@oclif/command' +import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' + +const CHANNEL_VISIBILITY_CONTEXTS = ['VISIBLE', 'HIDDEN'] as const + +export default class SetChannelVisibilityAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Set channel visibility as moderator.' + + static flags = { + channelId: flags.integer({ + char: 'c', + required: true, + description: 'ID of the channel', + }), + status: flags.enum({ + char: 's', + options: [...CHANNEL_VISIBILITY_CONTEXTS], + description: 'The visibility status of the channel', + required: true, + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'Reason for changing visibility of channel', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async run(): Promise { + const { channelId, status, rationale, context } = this.parse(SetChannelVisibilityAsModeratorCommand).flags + // Context + const { privilegeLevel } = await this.getApi().channelById(channelId) + const [actor, address] = await this.getModerationActionActor(context) + + // Ensure moderator has required permission + if (!(await this.isModeratorWithRequiredPermission(actor, privilegeLevel, 'HideChannel'))) { + this.error( + `Only content lead or curator with "HideChannel" permission can set visibility of channel ${channelId}!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + + await this.requireConfirmation( + `Are you sure you want to set channel visibility ${chalk.magentaBright( + channelId.toString() + )} to ${chalk.magentaBright(status)}?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'setChannelVisibilityAsModerator', [ + actor, + channelId, + status === 'HIDDEN', + rationale, + ]) + } +} diff --git a/cli/src/commands/content/setFeaturedVideos.ts b/cli/src/commands/content/setFeaturedVideos.ts deleted file mode 100644 index 16c966d5e5..0000000000 --- a/cli/src/commands/content/setFeaturedVideos.ts +++ /dev/null @@ -1,28 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' - -export default class SetFeaturedVideosCommand extends ContentDirectoryCommandBase { - static description = 'Set featured videos. Requires lead access.' - - static args = [ - { - name: 'featuredVideoIds', - required: true, - description: 'Comma-separated video IDs (ie. 1,2,3)', - }, - ] - - static flags = { - ...ContentDirectoryCommandBase.flags, - } - - async run(): Promise { - const { featuredVideoIds } = this.parse(SetFeaturedVideosCommand).args - - const [actor, address] = await this.getContentActor('Lead') - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'setFeaturedVideos', [ - actor, - (featuredVideoIds as string).split(','), - ]) - } -} diff --git a/cli/src/commands/content/setVideoVisibilityAsModerator.ts b/cli/src/commands/content/setVideoVisibilityAsModerator.ts new file mode 100644 index 0000000000..57519205fe --- /dev/null +++ b/cli/src/commands/content/setVideoVisibilityAsModerator.ts @@ -0,0 +1,59 @@ +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import { flags } from '@oclif/command' +import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' + +const VIDEO_VISIBILITY_CONTEXTS = ['VISIBLE', 'HIDDEN'] as const + +export default class SetVideoVisibilityAsModeratorCommand extends ContentDirectoryCommandBase { + static description = 'Set video visibility as moderator.' + + static flags = { + videoId: flags.integer({ + char: 'v', + required: true, + description: 'ID of the Video', + }), + status: flags.enum({ + char: 's', + options: [...VIDEO_VISIBILITY_CONTEXTS], + description: 'The visibility status of the video', + required: true, + }), + rationale: flags.string({ + char: 'r', + required: true, + description: 'Reason for changing visibility of video', + }), + context: ContentDirectoryCommandBase.moderationActionContextFlag, + ...ContentDirectoryCommandBase.flags, + } + + async run(): Promise { + const { videoId, status, rationale, context } = this.parse(SetVideoVisibilityAsModeratorCommand).flags + // Context + const { inChannel } = await this.getApi().videoById(videoId) + const { privilegeLevel } = await this.getApi().channelById(inChannel) + const [actor, address] = await this.getModerationActionActor(context) + + // Ensure moderator has required permission + if (!(await this.isModeratorWithRequiredPermission(actor, privilegeLevel, 'HideVideo'))) { + this.error(`Only content lead or curator with "HideVideo" permission can set visibility of video ${videoId}!`, { + exit: ExitCodes.AccessDenied, + }) + } + + await this.requireConfirmation( + `Are you sure you want to set video visibility ${chalk.magentaBright( + videoId.toString() + )} to ${chalk.magentaBright(status)}?` + ) + + await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'setVideoVisibilityAsModerator', [ + actor, + videoId, + status === 'HIDDEN', + rationale, + ]) + } +} diff --git a/cli/src/commands/content/updateChannel.ts b/cli/src/commands/content/updateChannel.ts index 73d4185275..af5161f9f3 100644 --- a/cli/src/commands/content/updateChannel.ts +++ b/cli/src/commands/content/updateChannel.ts @@ -3,8 +3,7 @@ import { asValidatedMetadata, metadataToBytes } from '../../helpers/serializatio import { ChannelUpdateInputParameters } from '../../Types' import { flags } from '@oclif/command' import UploadCommandBase from '../../base/UploadCommandBase' -import { CreateInterface, createType } from '@joystream/types' -import { ChannelUpdateParameters } from '@joystream/types/content' +import { createType } from '@joystream/types' import { ChannelUpdateInputSchema } from '../../schemas/ContentDirectory' import { ChannelMetadata } from '@joystream/metadata-protobuf' import { DataObjectInfoFragment } from '../../graphql/generated/queries' @@ -13,6 +12,7 @@ import { formatBalance } from '@polkadot/util' import chalk from 'chalk' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import ExitCodes from '../../ExitCodes' +import { PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission } from '@polkadot/types/lookup' export default class UpdateChannelCommand extends UploadCommandBase { static description = 'Update existing content directory channel.' @@ -34,24 +34,11 @@ export default class UpdateChannelCommand extends UploadCommandBase { }, ] - parseRewardAccountInput(rewardAccount?: string | null): string | null | Uint8Array { - if (rewardAccount === undefined) { - // Reward account remains unchanged - return null - } else if (rewardAccount === null) { - // Reward account changed to empty - return new Uint8Array([1, 0]) - } else { - // Reward account set to new account - return rewardAccount - } - } - async getAssetsToRemove( channelId: number, coverPhotoIndex: number | undefined, avatarPhotoIndex: number | undefined - ): Promise { + ): Promise { let assetsToRemove: DataObjectInfoFragment[] = [] if (coverPhotoIndex !== undefined || avatarPhotoIndex !== undefined) { const currentAssets = await this.getQNApi().dataObjectsByChannelId(channelId.toString()) @@ -66,12 +53,15 @@ export default class UpdateChannelCommand extends UploadCommandBase { if (assetsToRemove.length) { this.log(`\nData objects to be removed due to replacement:`) assetsToRemove.forEach((a) => this.log(`- ${a.id} (${a.type.__typename})`)) - const totalPrize = assetsToRemove.reduce((sum, { deletionPrize }) => sum.add(new BN(deletionPrize)), new BN(0)) - this.log(`Total deletion prize: ${chalk.cyanBright(formatBalance(totalPrize))}\n`) + const totalStateBloatBond = assetsToRemove.reduce( + (sum, { stateBloatBond }) => sum.add(new BN(stateBloatBond)), + new BN(0) + ) + this.log(`Total state bloat bond: ${chalk.cyanBright(formatBalance(totalStateBloatBond))}\n`) } } - return assetsToRemove.map((a) => a.id) + return assetsToRemove.map((a) => Number(a.id)) } async run(): Promise { @@ -83,23 +73,17 @@ export default class UpdateChannelCommand extends UploadCommandBase { // Context const channel = await this.getApi().channelById(channelId) const [actor, address] = await this.getChannelManagementActor(channel, context) - const { id: memberId } = await this.getRequiredMemberContext(true) const keypair = await this.getDecodedPair(address) const channelInput = await getInputJson(input, ChannelUpdateInputSchema) const meta = asValidatedMetadata(ChannelMetadata, channelInput) - const { collaborators, rewardAccount, coverPhotoPath, avatarPhotoPath } = channelInput - - if (rewardAccount !== undefined && !this.isChannelOwner(channel, actor)) { - this.error("Only channel owner is allowed to update channel's reward account!", { exit: ExitCodes.AccessDenied }) - } - - if (collaborators !== undefined && !this.isChannelOwner(channel, actor)) { - this.error("Only channel owner is allowed to update channel's collaborators!", { exit: ExitCodes.AccessDenied }) - } + const { collaborators, coverPhotoPath, avatarPhotoPath } = channelInput if (collaborators) { - await this.validateMemberIdsSet(collaborators, 'collaborator') + await this.validateMemberIdsSet( + collaborators.map(({ memberId }) => memberId), + 'collaborator' + ) } const [resolvedAssets, assetIndices] = await this.resolveAndValidateAssets( @@ -111,7 +95,9 @@ export default class UpdateChannelCommand extends UploadCommandBase { meta.coverPhoto = assetIndices.coverPhotoPath meta.avatarPhoto = assetIndices.avatarPhotoPath - // Preare and send the extrinsic + // Prepare and send the extrinsic + const serializedMeta = metadataToBytes(ChannelMetadata, meta) + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() const assetsToUpload = await this.prepareAssetsForExtrinsic(resolvedAssets) const assetsToRemove = await this.getAssetsToRemove( channelId, @@ -119,20 +105,38 @@ export default class UpdateChannelCommand extends UploadCommandBase { assetIndices.avatarPhotoPath ) - const channelUpdateParameters: CreateInterface = { - assets_to_upload: assetsToUpload, - assets_to_remove: createType('BTreeSet', assetsToRemove), - new_meta: metadataToBytes(ChannelMetadata, meta), - reward_account: this.parseRewardAccountInput(rewardAccount), - collaborators: createType('Option>', collaborators), + // Ensure actor is authorized to perform channel update + const requiredPermissions: ChannelActionPermission['type'][] = [] + if (collaborators) { + requiredPermissions.push('ManageChannelCollaborators') + } + if (assetsToUpload || assetsToRemove.length) { + requiredPermissions.push('ManageNonVideoChannelAssets') + } + if (serializedMeta.length) { + requiredPermissions.push('UpdateChannelMetadata') + } + if (!(await this.hasRequiredChannelAgentPermissions(actor, channel, requiredPermissions))) { + this.error(`Only channelOwner or collaborator with ${requiredPermissions} permission can perform this update!`, { + exit: ExitCodes.AccessDenied, + }) } + const channelUpdateParameters = createType('PalletContentChannelUpdateParametersRecord', { + expectedDataObjectStateBloatBond, + assetsToUpload, + assetsToRemove, + newMeta: serializedMeta.length ? serializedMeta : null, + collaborators: collaborators?.length + ? new Map(collaborators?.map(({ memberId, permissions }) => [memberId, permissions])) + : null, + storageBucketsNumWitness: await this.getStorageBucketsNumWitness(channelId), + }) this.jsonPrettyPrint( JSON.stringify({ assetsToUpload: assetsToUpload?.toJSON(), assetsToRemove, metadata: meta, - rewardAccount, collaborators, }) ) @@ -144,14 +148,20 @@ export default class UpdateChannelCommand extends UploadCommandBase { channelId, channelUpdateParameters, ]) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + + const channelUpdatedEvent = this.getEvent(result, 'content', 'ChannelUpdated') + const objectIds = channelUpdatedEvent.data[3] + + if (objectIds.size !== (assetsToUpload?.objectCreationList.length || 0)) { + this.error('Unexpected number of channel assets in ChannelUpdated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (objectIds.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), `dynamic:channel:${channelId.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + [...objectIds].map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), input ) } diff --git a/cli/src/commands/content/updateChannelCategory.ts b/cli/src/commands/content/updateChannelCategory.ts deleted file mode 100644 index 3882c1052c..0000000000 --- a/cli/src/commands/content/updateChannelCategory.ts +++ /dev/null @@ -1,54 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { getInputJson } from '../../helpers/InputOutput' -import { ChannelCategoryInputParameters } from '../../Types' -import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' -import { CreateInterface } from '@joystream/types' -import { ChannelCategoryUpdateParameters } from '@joystream/types/content' -import { flags } from '@oclif/command' -import { ChannelCategoryInputSchema } from '../../schemas/ContentDirectory' -import { ChannelCategoryMetadata } from '@joystream/metadata-protobuf' -export default class UpdateChannelCategoryCommand extends ContentDirectoryCommandBase { - static description = 'Update channel category inside content directory.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - input: flags.string({ - char: 'i', - required: true, - description: `Path to JSON file to use as input`, - }), - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'channelCategoryId', - required: true, - description: 'ID of the Channel Category', - }, - ] - - async run(): Promise { - const { context, input } = this.parse(UpdateChannelCategoryCommand).flags - - const { channelCategoryId } = this.parse(UpdateChannelCategoryCommand).args - - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - const channelCategoryInput = await getInputJson(input, ChannelCategoryInputSchema) - const meta = asValidatedMetadata(ChannelCategoryMetadata, channelCategoryInput) - - const channelCategoryUpdateParameters: CreateInterface = { - new_meta: metadataToBytes(ChannelCategoryMetadata, meta), - } - - this.jsonPrettyPrint(JSON.stringify(channelCategoryInput)) - - await this.requireConfirmation('Do you confirm the provided input?', true) - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateChannelCategory', [ - actor, - channelCategoryId, - channelCategoryUpdateParameters, - ]) - } -} diff --git a/cli/src/commands/content/updateChannelCensorshipStatus.ts b/cli/src/commands/content/updateChannelCensorshipStatus.ts deleted file mode 100644 index 0611900369..0000000000 --- a/cli/src/commands/content/updateChannelCensorshipStatus.ts +++ /dev/null @@ -1,78 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import chalk from 'chalk' -import ExitCodes from '../../ExitCodes' -import { flags } from '@oclif/command' - -export default class UpdateChannelCensorshipStatusCommand extends ContentDirectoryCommandBase { - static description = 'Update Channel censorship status (Censored / Not censored).' - static flags = { - rationale: flags.string({ - name: 'rationale', - required: false, - description: 'rationale', - }), - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'id', - required: true, - description: 'ID of the Channel', - }, - { - name: 'status', - required: false, - description: 'New censorship status of the channel (1 - censored, 0 - not censored)', - }, - ] - - async run(): Promise { - let { - args: { id, status }, - flags: { rationale }, - } = this.parse(UpdateChannelCensorshipStatusCommand) - - const channel = await this.getApi().channelById(id) - const [actor, address] = await this.getCurationActorByChannel(channel) - - if (status === undefined) { - status = await this.simplePrompt({ - type: 'list', - message: 'Select new status', - choices: [ - { name: 'Censored', value: true }, - { name: 'Not censored', value: false }, - ], - }) - } else { - if (status !== '0' && status !== '1') { - this.error('Invalid status provided. Use "1" for censored and "0" for not censored.', { - exit: ExitCodes.InvalidInput, - }) - } - status = !!parseInt(status) - } - - if (rationale === undefined) { - rationale = (await this.simplePrompt({ - message: 'Please provide the rationale for updating the status', - })) as string - } - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateChannelCensorshipStatus', [ - actor, - id, - status, - rationale, - ]) - - console.log( - chalk.green( - `Channel ${chalk.magentaBright(id)} censorship status successfully changed to: ${chalk.magentaBright( - status ? 'Censored' : 'Not censored' - )}!` - ) - ) - } -} diff --git a/cli/src/commands/content/updateChannelModerators.ts b/cli/src/commands/content/updateChannelModerators.ts deleted file mode 100644 index 824baa6efd..0000000000 --- a/cli/src/commands/content/updateChannelModerators.ts +++ /dev/null @@ -1,57 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import chalk from 'chalk' -import { flags } from '@oclif/command' -import { BTreeSet } from '@polkadot/types' -import { createType } from '@joystream/types' -import { MemberId } from '@joystream/types/common' - -export default class UpdateChannelModeratorsCommand extends ContentDirectoryCommandBase { - static description = "Update Channel's moderator set." - static flags = { - channelId: flags.integer({ - char: 'c', - required: true, - description: 'Channel id', - }), - moderators: flags.integer({ - char: 'm', - required: false, - multiple: true, - description: 'New set of moderators', - }), - ...ContentDirectoryCommandBase.flags, - } - - static examples = ['$ content:updateChannelModerators -c 1 -m 1 2 3'] - - async run(): Promise { - const { - flags: { channelId, moderators }, - } = this.parse(UpdateChannelModeratorsCommand) - - const channel = await this.getApi().channelById(channelId) - const [actor, address] = await this.getChannelOwnerActor(channel) - - this.jsonPrettyPrint( - JSON.stringify({ - channelId, - moderators: moderators || [], - }) - ) - await this.requireConfirmation('Do you confirm the provided input?', true) - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateModeratorSet', [ - actor, - createType, 'BTreeSet'>('BTreeSet', moderators || []), - channelId, - ]) - - console.log( - chalk.green( - `Channel ${chalk.magentaBright(channelId)} moderator set successfully updated to: ${ - moderators?.length ? moderators.map((mId) => chalk.magentaBright(mId.toString())).join(', ') : '' - }!` - ) - ) - } -} diff --git a/cli/src/commands/content/updateChannelStateBloatBond.ts b/cli/src/commands/content/updateChannelStateBloatBond.ts new file mode 100644 index 0000000000..ac905ef566 --- /dev/null +++ b/cli/src/commands/content/updateChannelStateBloatBond.ts @@ -0,0 +1,35 @@ +import chalk from 'chalk' +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' + +export default class UpdateChannelStateBloatBondCommand extends ContentDirectoryCommandBase { + static description = 'Update channel state bloat bond.' + static args = [ + { + name: 'value', + required: true, + description: 'New state bloat bond value', + }, + ] + + async run(): Promise { + const { value } = this.parse(UpdateChannelStateBloatBondCommand).args + + // Context + const lead = await this.getRequiredLeadContext() + const keypair = await this.getDecodedPair(lead.roleAccount) + + this.jsonPrettyPrint(JSON.stringify({ newChannelStateBloatBond: value })) + + await this.requireConfirmation('Do you confirm the provided input?', true) + + const result = await this.sendAndFollowNamedTx(keypair, 'content', 'updateChannelStateBloatBond', [value]) + + const channelStateBloatBondValueUpdatedEvent = this.getEvent(result, 'content', 'ChannelStateBloatBondValueUpdated') + const channelStateBloatBondValue = channelStateBloatBondValueUpdatedEvent.data[0] + + this.log( + chalk.green(`Updated channel state bloat bond is ${chalk.cyanBright(channelStateBloatBondValue.toString())}!`) + ) + this.output(value.toString()) + } +} diff --git a/cli/src/commands/content/updateCuratorGroupPermissions.ts b/cli/src/commands/content/updateCuratorGroupPermissions.ts new file mode 100644 index 0000000000..ceb9b9cee5 --- /dev/null +++ b/cli/src/commands/content/updateCuratorGroupPermissions.ts @@ -0,0 +1,64 @@ +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import chalk from 'chalk' +import { flags } from '@oclif/command' +import { getInputJson } from '../../helpers/InputOutput' +import { ModerationPermissionsByLevelInputParameters } from '../../Types' +import { ModerationPermissionsByLevelInputSchema } from '../../schemas/ContentDirectory' +import { createType } from '@joystream/types' + +export default class UpdateCuratorGroupPermissionsCommand extends ContentDirectoryCommandBase { + static description = 'Update existing Curator Group.' + static args = [ + { + name: 'id', + required: false, + description: 'ID of the Curator Group', + }, + ] + + static flags = { + permissions: flags.string({ + char: 'p', + required: true, + description: `Path to JSON file containing moderation permissions by channel privilege level to use as input`, + }), + ...ContentDirectoryCommandBase.flags, + } + + async run(): Promise { + let { id } = this.parse(UpdateCuratorGroupPermissionsCommand).args + const { permissions } = this.parse(UpdateCuratorGroupPermissionsCommand).flags + + if (id === undefined) { + id = await this.promptForCuratorGroup() + } else { + await this.getCuratorGroup(id) + } + + const lead = await this.getRequiredLeadContext() + const keypair = await this.getDecodedPair(lead.roleAccount) + + const moderationPermissionsByLevelInput = await getInputJson( + permissions, + ModerationPermissionsByLevelInputSchema + ) + console.log(moderationPermissionsByLevelInput) + + const moderationPermissionsByLevel = createType( + 'BTreeMap>', + new Map( + moderationPermissionsByLevelInput.map(({ channelPrivilegeLevel, permissions }) => [ + channelPrivilegeLevel, + permissions, + ]) + ) + ) + + await this.sendAndFollowNamedTx(keypair, 'content', 'updateCuratorGroupPermissions', [ + id, + moderationPermissionsByLevel, + ]) + + console.log(chalk.green(`Curator Group permissions successfully updated!`)) + } +} diff --git a/cli/src/commands/content/updatePlaylist.ts b/cli/src/commands/content/updatePlaylist.ts index 05c4abc932..e5abf4e418 100644 --- a/cli/src/commands/content/updatePlaylist.ts +++ b/cli/src/commands/content/updatePlaylist.ts @@ -1,10 +1,11 @@ import { ContentMetadata, PlaylistMetadata } from '@joystream/metadata-protobuf' -import { CreateInterface, createType } from '@joystream/types' -import { VideoUpdateParameters } from '@joystream/types/content' +import { CreateInterface } from '@joystream/types' import { flags } from '@oclif/command' +import { PalletContentVideoUpdateParametersRecord as VideoUpdateParameters } from '@polkadot/types/lookup' import { formatBalance } from '@polkadot/util' import BN from 'bn.js' import chalk from 'chalk' +import ExitCodes from '../../ExitCodes' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import UploadCommandBase from '../../base/UploadCommandBase' import { DataObjectInfoFragment } from '../../graphql/generated/queries' @@ -33,7 +34,7 @@ export default class UpdatePlaylistCommand extends UploadCommandBase { }, ] - async getAssetsToRemove(playlistId: number, thumbnailIndex: number | undefined): Promise { + async getAssetsToRemove(playlistId: number, thumbnailIndex: number | undefined): Promise { let assetsToRemove: DataObjectInfoFragment[] = [] if (thumbnailIndex) { const currentAssets = await this.getQNApi().dataObjectsByVideoId(playlistId.toString()) @@ -44,12 +45,15 @@ export default class UpdatePlaylistCommand extends UploadCommandBase { if (assetsToRemove.length) { this.log(`\nData objects to be removed due to replacement:`) assetsToRemove.forEach((a) => this.log(`- ${a.id} (${a.type.__typename})`)) - const totalPrize = assetsToRemove.reduce((sum, { deletionPrize }) => sum.add(new BN(deletionPrize)), new BN(0)) + const totalPrize = assetsToRemove.reduce( + (sum, { stateBloatBond }) => sum.add(new BN(stateBloatBond)), + new BN(0) + ) this.log(`Total deletion prize: ${chalk.cyanBright(formatBalance(totalPrize))}\n`) } } - return assetsToRemove.map((a) => a.id) + return assetsToRemove.map((a) => new BN(a.id)) } async run(): Promise { @@ -60,14 +64,12 @@ export default class UpdatePlaylistCommand extends UploadCommandBase { // Context const playlist = await this.getApi().videoById(playlistId) // video & playlist have same runtime representation - const channel = await this.getApi().channelById(playlist.in_channel.toNumber()) + const channel = await this.getApi().channelById(playlist.inChannel.toNumber()) const [actor, address] = await this.getChannelManagementActor(channel, context) - const { id: memberId } = await this.getRequiredMemberContext(true) const keypair = await this.getDecodedPair(address) const playlistInput = await getInputJson(input, PlaylistInputSchema) const meta = asValidatedMetadata(PlaylistMetadata, playlistInput) - const { enableComments } = playlistInput const { thumbnailPhotoPath } = playlistInput const [resolvedAssets, assetIndices] = await this.resolveAndValidateAssets({ thumbnailPhotoPath }, input) @@ -75,18 +77,21 @@ export default class UpdatePlaylistCommand extends UploadCommandBase { // "undefined" values will be omitted when the metadata is encoded. It's not possible to "unset" an asset this way. meta.thumbnailPhoto = assetIndices.thumbnailPhotoPath - // Preare and send the extrinsic + // Prepare and send the extrinsic + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() const assetsToUpload = await this.prepareAssetsForExtrinsic(resolvedAssets) const assetsToRemove = await this.getAssetsToRemove(playlistId, assetIndices.thumbnailPhotoPath) const playlistUpdateParameters: CreateInterface = { - assets_to_upload: assetsToUpload, - new_meta: metadataToBytes(ContentMetadata, { playlistMetadata: meta }), - assets_to_remove: createType('BTreeSet', assetsToRemove), - enable_comments: enableComments, + assetsToUpload, + assetsToRemove, + autoIssueNft: null, + expectedDataObjectStateBloatBond, + newMeta: metadataToBytes(ContentMetadata, { playlistMetadata: meta }), + storageBucketsNumWitness: await this.getStorageBucketsNumWitness(playlist.inChannel), } this.jsonPrettyPrint( - JSON.stringify({ assetsToUpload: assetsToUpload?.toJSON(), newMetadata: meta, assetsToRemove, enableComments }) + JSON.stringify({ assetsToUpload: assetsToUpload?.toJSON(), newMetadata: meta, assetsToRemove }) ) await this.requireConfirmation('Do you confirm the provided input?', true) @@ -96,14 +101,23 @@ export default class UpdatePlaylistCommand extends UploadCommandBase { playlistId, playlistUpdateParameters, ]) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + + const playlistUpdatedEvent = this.getEvent(result, 'content', 'VideoUpdated') + const objectIds = playlistUpdatedEvent.data[3] + + if (objectIds.size !== (assetsToUpload?.objectCreationList.length || 0)) { + this.error('Unexpected number of video assets in VideoUpdated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (objectIds.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), - `dynamic:channel:${playlist.in_channel.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + `dynamic:channel:${playlist.inChannel.toString()}`, + [...objectIds].map((id, index) => ({ + dataObjectId: id, + path: resolvedAssets[index].path, + })), input ) } diff --git a/cli/src/commands/content/updateVideo.ts b/cli/src/commands/content/updateVideo.ts index d0c613c26e..382da72181 100644 --- a/cli/src/commands/content/updateVideo.ts +++ b/cli/src/commands/content/updateVideo.ts @@ -1,17 +1,21 @@ import { getInputJson } from '../../helpers/InputOutput' -import { VideoInputParameters } from '../../Types' +import { VideoFileMetadata, VideoInputParameters } from '../../Types' import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' import UploadCommandBase from '../../base/UploadCommandBase' import { flags } from '@oclif/command' -import { CreateInterface, createType } from '@joystream/types' -import { VideoUpdateParameters } from '@joystream/types/content' +import { CreateInterface } from '@joystream/types' +import { + PalletContentVideoUpdateParametersRecord as VideoUpdateParameters, + PalletContentIterableEnumsChannelActionPermission as ChannelActionPermission, +} from '@polkadot/types/lookup' import { VideoInputSchema } from '../../schemas/ContentDirectory' -import { VideoMetadata } from '@joystream/metadata-protobuf' +import { ContentMetadata, IVideoMetadata, VideoMetadata } from '@joystream/metadata-protobuf' import { DataObjectInfoFragment } from '../../graphql/generated/queries' import BN from 'bn.js' import { formatBalance } from '@polkadot/util' import chalk from 'chalk' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' +import ExitCodes from '../../ExitCodes' export default class UpdateVideoCommand extends UploadCommandBase { static description = 'Update video under specific id.' @@ -37,7 +41,7 @@ export default class UpdateVideoCommand extends UploadCommandBase { videoId: number, videoIndex: number | undefined, thumbnailIndex: number | undefined - ): Promise { + ): Promise { let assetsToRemove: DataObjectInfoFragment[] = [] if (videoIndex !== undefined || thumbnailIndex !== undefined) { const currentAssets = await this.getQNApi().dataObjectsByVideoId(videoId.toString()) @@ -52,12 +56,29 @@ export default class UpdateVideoCommand extends UploadCommandBase { if (assetsToRemove.length) { this.log(`\nData objects to be removed due to replacement:`) assetsToRemove.forEach((a) => this.log(`- ${a.id} (${a.type.__typename})`)) - const totalPrize = assetsToRemove.reduce((sum, { deletionPrize }) => sum.add(new BN(deletionPrize)), new BN(0)) - this.log(`Total deletion prize: ${chalk.cyanBright(formatBalance(totalPrize))}\n`) + const totalStateBloatBond = assetsToRemove.reduce( + (sum, { stateBloatBond }) => sum.add(new BN(stateBloatBond)), + new BN(0) + ) + this.log(`Total state bloat bond: ${chalk.cyanBright(formatBalance(totalStateBloatBond))}\n`) } } - return assetsToRemove.map((a) => a.id) + return assetsToRemove.map((a) => Number(a.id)) + } + + setVideoMetadataDefaults(metadata: IVideoMetadata, videoFileMetadata: VideoFileMetadata): IVideoMetadata { + return { + duration: videoFileMetadata.duration, + mediaPixelWidth: videoFileMetadata.width, + mediaPixelHeight: videoFileMetadata.height, + mediaType: { + codecName: videoFileMetadata.codecName, + container: videoFileMetadata.container, + mimeMediaType: videoFileMetadata.mimeType, + }, + ...metadata, + } } async run(): Promise { @@ -68,34 +89,82 @@ export default class UpdateVideoCommand extends UploadCommandBase { // Context const video = await this.getApi().videoById(videoId) - const channel = await this.getApi().channelById(video.in_channel.toNumber()) + const channel = await this.getApi().channelById(video.inChannel.toNumber()) const [actor, address] = await this.getChannelManagementActor(channel, context) - const { id: memberId } = await this.getRequiredMemberContext(true) const keypair = await this.getDecodedPair(address) const videoInput = await getInputJson(input, VideoInputSchema) - const meta = asValidatedMetadata(VideoMetadata, videoInput) + let meta = asValidatedMetadata(VideoMetadata, videoInput) const { enableComments } = videoInput - const { videoPath, thumbnailPhotoPath } = videoInput - const [resolvedAssets, assetIndices] = await this.resolveAndValidateAssets({ videoPath, thumbnailPhotoPath }, input) + // Video assets + const { videoPath, thumbnailPhotoPath, subtitles } = videoInput + const [resolvedVideoAssets, videoAssetIndices] = await this.resolveAndValidateAssets( + { videoPath, thumbnailPhotoPath }, + input + ) // Set assets indices in the metadata // "undefined" values will be omitted when the metadata is encoded. It's not possible to "unset" an asset this way. - meta.video = assetIndices.videoPath - meta.thumbnailPhoto = assetIndices.thumbnailPhotoPath + meta.video = videoAssetIndices.videoPath + meta.thumbnailPhoto = videoAssetIndices.thumbnailPhotoPath - // Preare and send the extrinsic - const assetsToUpload = await this.prepareAssetsForExtrinsic(resolvedAssets) + // Subtitle assets + let subtitleAssetIndex = Object.values(videoAssetIndices).filter((v) => v !== undefined).length + const resolvedSubtitleAssets = ( + await Promise.all( + (subtitles || []).map(async (subtitleInputParameters, i) => { + const { subtitleAssetPath } = subtitleInputParameters + const [[resolvedAsset]] = await this.resolveAndValidateAssets({ subtitleAssetPath }, input) + // Set assets indices in the metadata + if (meta.subtitles && resolvedAsset) { + meta.subtitles[i].newAsset = subtitleAssetIndex++ + } + return resolvedAsset + }) + ) + ).filter((r) => r) + + // Try to get updated video file metadata + if (videoAssetIndices.videoPath !== undefined) { + const videoFileMetadata = await this.getVideoFileMetadata(resolvedVideoAssets[videoAssetIndices.videoPath].path) + this.log('Video media file parameters established:', videoFileMetadata) + meta = this.setVideoMetadataDefaults(meta, videoFileMetadata) + } + + // Prepare and send the extrinsic + const serializedMeta = metadataToBytes(VideoMetadata, meta) + const expectedDataObjectStateBloatBond = await this.getApi().dataObjectStateBloatBond() + const assetsToUpload = await this.prepareAssetsForExtrinsic([...resolvedVideoAssets, ...resolvedSubtitleAssets]) const assetsToRemove = await this.getAssetsToRemove( videoId, - assetIndices.videoPath, - assetIndices.thumbnailPhotoPath + videoAssetIndices.videoPath, + videoAssetIndices.thumbnailPhotoPath ) + + // Ensure actor is authorized to perform video update + const requiredPermissions: ChannelActionPermission['type'][] = [] + if (assetsToUpload || assetsToRemove.length) { + requiredPermissions.push('ManageVideoAssets') + } + if (serializedMeta.length) { + requiredPermissions.push('UpdateVideoMetadata') + } + if (!(await this.hasRequiredChannelAgentPermissions(actor, channel, requiredPermissions))) { + this.error( + `Only channelOwner or collaborator with ${requiredPermissions} permissions can update video ${videoId}!`, + { + exit: ExitCodes.AccessDenied, + } + ) + } + const videoUpdateParameters: CreateInterface = { - assets_to_upload: assetsToUpload, - new_meta: metadataToBytes(VideoMetadata, meta), - assets_to_remove: createType('BTreeSet', assetsToRemove), - enable_comments: enableComments, + expectedDataObjectStateBloatBond, + autoIssueNft: null, + assetsToUpload, + newMeta: metadataToBytes(ContentMetadata, { videoMetadata: meta }), + assetsToRemove, + storageBucketsNumWitness: await this.getStorageBucketsNumWitness(video.inChannel), } this.jsonPrettyPrint( @@ -109,14 +178,23 @@ export default class UpdateVideoCommand extends UploadCommandBase { videoId, videoUpdateParameters, ]) - const dataObjectsUploadedEvent = this.findEvent(result, 'storage', 'DataObjectsUploaded') - if (dataObjectsUploadedEvent) { - const [objectIds] = dataObjectsUploadedEvent.data + + const VideoUpdatedEvent = this.getEvent(result, 'content', 'VideoUpdated') + const objectIds = VideoUpdatedEvent.data[3] + + if (objectIds.size !== (assetsToUpload?.objectCreationList.length || 0)) { + this.error('Unexpected number of video assets in VideoUpdated event!', { + exit: ExitCodes.UnexpectedRuntimeState, + }) + } + + if (objectIds.size) { await this.uploadAssets( - keypair, - memberId.toNumber(), - `dynamic:channel:${video.in_channel.toString()}`, - objectIds.map((id, index) => ({ dataObjectId: id, path: resolvedAssets[index].path })), + `dynamic:channel:${video.inChannel.toString()}`, + [...objectIds].map((id, index) => ({ + dataObjectId: id, + path: [...resolvedVideoAssets, ...resolvedSubtitleAssets][index].path, + })), input ) } diff --git a/cli/src/commands/content/updateVideoCategory.ts b/cli/src/commands/content/updateVideoCategory.ts deleted file mode 100644 index 9a16f03ace..0000000000 --- a/cli/src/commands/content/updateVideoCategory.ts +++ /dev/null @@ -1,55 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { getInputJson } from '../../helpers/InputOutput' -import { VideoCategoryInputParameters } from '../../Types' -import { asValidatedMetadata, metadataToBytes } from '../../helpers/serialization' -import { flags } from '@oclif/command' -import { CreateInterface } from '@joystream/types' -import { VideoCategoryUpdateParameters } from '@joystream/types/content' -import { VideoCategoryInputSchema } from '../../schemas/ContentDirectory' -import { VideoCategoryMetadata } from '@joystream/metadata-protobuf' - -export default class UpdateVideoCategoryCommand extends ContentDirectoryCommandBase { - static description = 'Update video category inside content directory.' - static flags = { - context: ContentDirectoryCommandBase.categoriesContextFlag, - input: flags.string({ - char: 'i', - required: true, - description: `Path to JSON file to use as input`, - }), - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'videoCategoryId', - required: true, - description: 'ID of the Video Category', - }, - ] - - async run(): Promise { - const { context, input } = this.parse(UpdateVideoCategoryCommand).flags - - const { videoCategoryId } = this.parse(UpdateVideoCategoryCommand).args - - const [actor, address] = context ? await this.getContentActor(context) : await this.getCategoryManagementActor() - - const videoCategoryInput = await getInputJson(input, VideoCategoryInputSchema) - const meta = asValidatedMetadata(VideoCategoryMetadata, videoCategoryInput) - - const videoCategoryUpdateParameters: CreateInterface = { - new_meta: metadataToBytes(VideoCategoryMetadata, meta), - } - - this.jsonPrettyPrint(JSON.stringify(videoCategoryInput)) - - await this.requireConfirmation('Do you confirm the provided input?', true) - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateVideoCategory', [ - actor, - videoCategoryId, - videoCategoryUpdateParameters, - ]) - } -} diff --git a/cli/src/commands/content/updateVideoCensorshipStatus.ts b/cli/src/commands/content/updateVideoCensorshipStatus.ts deleted file mode 100644 index 688f20bcf3..0000000000 --- a/cli/src/commands/content/updateVideoCensorshipStatus.ts +++ /dev/null @@ -1,79 +0,0 @@ -import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import chalk from 'chalk' -import ExitCodes from '../../ExitCodes' -import { flags } from '@oclif/command' - -export default class UpdateVideoCensorshipStatusCommand extends ContentDirectoryCommandBase { - static description = 'Update Video censorship status (Censored / Not censored).' - static flags = { - rationale: flags.string({ - name: 'rationale', - required: false, - description: 'rationale', - }), - ...ContentDirectoryCommandBase.flags, - } - - static args = [ - { - name: 'id', - required: true, - description: 'ID of the Video', - }, - { - name: 'status', - required: false, - description: 'New video censorship status (1 - censored, 0 - not censored)', - }, - ] - - async run(): Promise { - let { - args: { id, status }, - flags: { rationale }, - } = this.parse(UpdateVideoCensorshipStatusCommand) - - const video = await this.getApi().videoById(id) - const channel = await this.getApi().channelById(video.in_channel.toNumber()) - const [actor, address] = await this.getCurationActorByChannel(channel) - - if (status === undefined) { - status = await this.simplePrompt({ - type: 'list', - message: 'Select new status', - choices: [ - { name: 'Censored', value: true }, - { name: 'Not censored', value: false }, - ], - }) - } else { - if (status !== '0' && status !== '1') { - this.error('Invalid status provided. Use "1" for Censored and "0" for Not censored.', { - exit: ExitCodes.InvalidInput, - }) - } - status = !!parseInt(status) - } - - if (rationale === undefined) { - rationale = (await this.simplePrompt({ - message: 'Please provide the rationale for updating the status', - })) as string - } - - await this.sendAndFollowNamedTx(await this.getDecodedPair(address), 'content', 'updateVideoCensorshipStatus', [ - actor, - id, - status, - rationale, - ]) - - console.log( - chalk.green( - `Video ${chalk.magentaBright(id)} censorship status successfully changed to: ${chalk.magentaBright( - status ? 'Censored' : 'Not censored' - )}!` - ) - ) - } -} diff --git a/cli/src/commands/content/updateVideoStateBloatBond.ts b/cli/src/commands/content/updateVideoStateBloatBond.ts new file mode 100644 index 0000000000..7c96b04748 --- /dev/null +++ b/cli/src/commands/content/updateVideoStateBloatBond.ts @@ -0,0 +1,33 @@ +import chalk from 'chalk' +import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' + +export default class UpdateVideoStateBloatBondCommand extends ContentDirectoryCommandBase { + static description = 'Update video state bloat bond.' + static args = [ + { + name: 'value', + required: true, + description: 'New state bloat bond value', + }, + ] + + async run(): Promise { + const { value } = this.parse(UpdateVideoStateBloatBondCommand).args + + // Context + const lead = await this.getRequiredLeadContext() + const keypair = await this.getDecodedPair(lead.roleAccount) + + this.jsonPrettyPrint(JSON.stringify({ newVideoStateBloatBond: value })) + + await this.requireConfirmation('Do you confirm the provided input?', true) + + const result = await this.sendAndFollowNamedTx(keypair, 'content', 'updateVideoStateBloatBond', [value]) + + const videoStateBloatBondValueUpdatedEvent = this.getEvent(result, 'content', 'VideoStateBloatBondValueUpdated') + const videoStateBloatBondValue = videoStateBloatBondValueUpdatedEvent.data[0] + + this.log(chalk.green(`Updated video state bloat bond is ${chalk.cyanBright(videoStateBloatBondValue.toString())}!`)) + this.output(value.toString()) + } +} diff --git a/cli/src/commands/content/video.ts b/cli/src/commands/content/video.ts index f5b87ef4d2..2bd0d94ba3 100644 --- a/cli/src/commands/content/video.ts +++ b/cli/src/commands/content/video.ts @@ -1,3 +1,4 @@ +import { formatBalance } from '@polkadot/util' import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' import { displayCollapsedRow } from '../../helpers/display' @@ -21,10 +22,9 @@ export default class VideoCommand extends ContentDirectoryCommandBase { if (aVideo) { displayCollapsedRow({ 'ID': videoId.toString(), - 'InChannel': aVideo.in_channel.toString(), - 'IsCensored': aVideo.is_censored.toString(), - 'CommentsEnabled': aVideo.enable_comments.toString(), - 'PostId': aVideo.video_post_id.toString(), + 'InChannel': aVideo.inChannel.toString(), + 'VideoStateBloatBond': formatBalance(aVideo.videoStateBloatBond.amount), + 'DataObjects': aVideo.dataObjects.toString(), }) } else { this.error(`Video not found by channel id: "${videoId}"!`) diff --git a/cli/src/commands/content/videos.ts b/cli/src/commands/content/videos.ts index 354f0e007c..c00f2f2ff0 100644 --- a/cli/src/commands/content/videos.ts +++ b/cli/src/commands/content/videos.ts @@ -1,6 +1,8 @@ import ContentDirectoryCommandBase from '../../base/ContentDirectoryCommandBase' -import { Video, VideoId } from '@joystream/types/content' +import { VideoId } from '@joystream/types/primitives' +import { PalletContentVideoRecord as Video } from '@polkadot/types/lookup' import { displayTable } from '../../helpers/display' +import { formatBalance } from '@polkadot/util' export default class VideosCommand extends ContentDirectoryCommandBase { static description = 'List existing content directory videos.' @@ -22,17 +24,16 @@ export default class VideosCommand extends ContentDirectoryCommandBase { let videos: [VideoId, Video][] = await this.getApi().availableVideos() if (channelId) { - videos = videos.filter(([, v]) => v.in_channel.eqn(parseInt(channelId))) + videos = videos.filter(([, v]) => v.inChannel.eqn(parseInt(channelId))) } if (videos.length > 0) { displayTable( videos.map(([id, v]) => ({ 'ID': id.toString(), - 'InChannel': v.in_channel.toString(), - 'IsCensored': v.is_censored.toString(), - 'CommentsEnabled': v.enable_comments.toString(), - 'PostId': v.video_post_id.toString(), + 'InChannel': v.inChannel.toString(), + 'VideoStateBloatBond': formatBalance(v.videoStateBloatBond.amount), + 'DataObjects': v.dataObjects.toString(), })), 3 ) diff --git a/cli/src/commands/fee-profile/addForumPost.ts b/cli/src/commands/fee-profile/addForumPost.ts new file mode 100644 index 0000000000..ad171b6e72 --- /dev/null +++ b/cli/src/commands/fee-profile/addForumPost.ts @@ -0,0 +1,38 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { formatBalance } from '@polkadot/util' +import chalk from 'chalk' + +const DEFAULT_POST_LENGTH = 200 + +export default class FeeProfileAddForumPost extends FeeProfileCommandBase { + static description = 'Create fee profile of forum.add_post extrinsic.' + + static flags = { + postLen: flags.integer({ + char: 'p', + default: DEFAULT_POST_LENGTH, + description: 'Post length to use for estimating tx fee', + }), + editable: flags.boolean({ + char: 'e', + description: 'If specified - `editable` parameter is set to true when estimating the costs', + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { postLen, editable = false } = this.parse(FeeProfileAddForumPost).flags + const { postDeposit } = api.consts.forum + + this.log(`Post deposit: ${chalk.cyanBright(formatBalance(postDeposit))}`) + this.log('Parameters:') + this.jsonPrettyPrint(JSON.stringify({ postLen, editable })) + + const tx = api.tx.forum.addPost(0, 0, 0, _.repeat('x', postLen), editable) + const extraCosts = editable ? { postDeposit } : undefined + await this.profile(tx, extraCosts) + } +} diff --git a/cli/src/commands/fee-profile/addVideoComment.ts b/cli/src/commands/fee-profile/addVideoComment.ts new file mode 100644 index 0000000000..faefdeab21 --- /dev/null +++ b/cli/src/commands/fee-profile/addVideoComment.ts @@ -0,0 +1,38 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { IMemberRemarked, MemberRemarked } from '@joystream/metadata-protobuf' +import { metadataToBytes } from '../../helpers/serialization' +import Long from 'long' + +const DEFAULT_COMMENT_LENGTH = 50 + +export default class FeeProfileAddVideoComment extends FeeProfileCommandBase { + static description = 'Create fee profile of members.member_remark extrinsic (video comment case).' + + static flags = { + commentLen: flags.integer({ + char: 'c', + default: DEFAULT_COMMENT_LENGTH, + description: 'Comment length to use for estimating tx fee', + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { commentLen } = this.parse(FeeProfileAddVideoComment).flags + + this.log('Parameters:') + this.jsonPrettyPrint(JSON.stringify({ commentLen })) + + const mockMetadata: IMemberRemarked = { + createComment: { + videoId: Long.fromNumber(0), + body: _.repeat('x', commentLen), + }, + } + const tx = api.tx.members.memberRemark(0, metadataToBytes(MemberRemarked, mockMetadata)) + await this.profile(tx) + } +} diff --git a/cli/src/commands/fee-profile/buyMembership.ts b/cli/src/commands/fee-profile/buyMembership.ts new file mode 100644 index 0000000000..ed21df85a8 --- /dev/null +++ b/cli/src/commands/fee-profile/buyMembership.ts @@ -0,0 +1,95 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { IMembershipMetadata, MembershipMetadata } from '@joystream/metadata-protobuf' +import { metadataToBytes } from '../../helpers/serialization' +import { createType } from '@joystream/types' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_HANDLE_LENGTH = 10 +const DEFAULT_NAME_LENGTH = 10 +const DEFAULT_ABOUT_LENGTH = 0 +const DEFAULT_AVATAR_URI_LENGTH = 25 +const DEFAULT_EXTERNAL_RESOURCES_COUNT = 1 +const DEFAULT_EXTERNAL_RESOURCE_LENGTH = 25 + +export default class FeeProfileBuyMembershipCommand extends FeeProfileCommandBase { + static description = 'Create fee profile of members.buy_membership extrinsic.' + + static flags = { + handleLength: flags.integer({ + char: 'h', + default: DEFAULT_HANDLE_LENGTH, + description: 'Length of the membership handle to use for estimating tx fee', + }), + nameLength: flags.integer({ + char: 'n', + default: DEFAULT_NAME_LENGTH, + description: "Length of the member's name (part of metadata) to use for estimating tx fee", + }), + aboutLength: flags.integer({ + char: 'a', + default: DEFAULT_ABOUT_LENGTH, + description: "Length of the member's about text (part of metadata) to use for estimating tx fee", + }), + avatarUriLength: flags.integer({ + char: 'u', + default: DEFAULT_AVATAR_URI_LENGTH, + description: "Length of the member's avatar uri (part of metadata) to use for estimating tx fee", + }), + externalResourcesCount: flags.integer({ + char: 'E', + default: DEFAULT_EXTERNAL_RESOURCES_COUNT, + description: 'Number of external resources (part of metadata) to use for estimating tx fee', + }), + externalResourceLength: flags.integer({ + char: 'e', + default: DEFAULT_EXTERNAL_RESOURCE_LENGTH, + description: 'Length of a single external resource url (part of metadata) to use for estimating tx fee', + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { handleLength, nameLength, aboutLength, avatarUriLength, externalResourcesCount, externalResourceLength } = + this.parse(FeeProfileBuyMembershipCommand).flags + const membershipPrice = await api.query.members.membershipPrice() + + this.log(`Membership price: ${chalk.cyanBright(formatBalance(membershipPrice))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + handleLength, + nameLength, + aboutLength, + avatarUriLength, + externalResourcesCount, + externalResourceLength, + }) + ) + + const metadata: IMembershipMetadata = { + name: _.repeat('x', nameLength), + about: _.repeat('x', aboutLength), + avatarUri: _.repeat('x', avatarUriLength), + externalResources: Array.from({ length: externalResourcesCount }, () => ({ + type: MembershipMetadata.ExternalResource.ResourceType.HYPERLINK, + value: _.repeat('x', externalResourceLength), + })), + } + + const tx = api.tx.members.buyMembership( + createType('PalletMembershipBuyMembershipParameters', { + handle: _.repeat('x', handleLength), + rootAccount: this.pairs.alice.address, + controllerAccount: this.pairs.bob.address, + metadata: metadataToBytes(MembershipMetadata, metadata), + referrerId: null, + }) + ) + const extraCosts = { membershipPrice } + await this.profile(tx, extraCosts) + } +} diff --git a/cli/src/commands/fee-profile/createChannel.ts b/cli/src/commands/fee-profile/createChannel.ts new file mode 100644 index 0000000000..3a103e1c6e --- /dev/null +++ b/cli/src/commands/fee-profile/createChannel.ts @@ -0,0 +1,172 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { ChannelMetadata, IChannelMetadata } from '@joystream/metadata-protobuf' +import { metadataToBytes } from '../../helpers/serialization' +import { createType } from '@joystream/types' +import { + PalletContentIterableEnumsChannelActionPermission, + PalletContentStorageAssetsRecord, +} from '@polkadot/types/lookup' +import BN from 'bn.js' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_COLLABORATORS_NUM = 0 +const DEFAULT_AVATAR_SIZE_MB = 1 +const DEFAULT_COVER_PHOTO_SIZE_MB = 1 +const DEFAULT_TITLE_LENGTH = 15 +const DEFAULT_DESCRIPTION_LENGTH = 200 + +export default class FeeProfileCreateChannel extends FeeProfileCommandBase { + static description = 'Create fee profile of content.create_channel extrinsic.' + + static flags = { + titleLen: flags.integer({ + char: 't', + default: DEFAULT_TITLE_LENGTH, + description: 'Channel title (part of channel metadata) length to use for estimating tx fee', + }), + descriptionLen: flags.integer({ + char: 'd', + default: DEFAULT_DESCRIPTION_LENGTH, + description: 'Channel description (part of channel metadata) length to use for estimating tx fee', + }), + collaboratorsNum: flags.integer({ + char: 'C', + default: DEFAULT_COLLABORATORS_NUM, + description: 'Number of channel collaborators to use for estimating tx fee', + }), + noAvatar: flags.boolean({ + description: 'If provided - channel with no avatar will be used for estimating the costs', + exclusive: ['avatarSize'], + }), + noCover: flags.boolean({ + description: 'If provided - channel with no cover photo will be used for estimating the costs', + exclusive: ['coverSize'], + }), + avatarSize: flags.integer({ + char: 'a', + default: DEFAULT_AVATAR_SIZE_MB, + description: 'Avatar size in MB to use when estimating the costs', + }), + coverSize: flags.integer({ + char: 'c', + default: DEFAULT_COVER_PHOTO_SIZE_MB, + description: 'Cover photo size in MB to use when estimating the costs', + }), + distributionBucketsNum: flags.integer({ + char: 'D', + description: + 'Number of distribution buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + storageBucketsNum: flags.integer({ + char: 'S', + description: + 'Number of storage buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + ...super.flags, + } + + getAssets(expectedDataSizeFee: BN): PalletContentStorageAssetsRecord | null { + const { noAvatar, noCover, avatarSize, coverSize } = this.parse(FeeProfileCreateChannel).flags + if (noAvatar && noCover) { + return null + } + const mockAvatar = this.mockAsset(avatarSize) + const mockCover = this.mockAsset(coverSize) + const objectCreationList = [mockAvatar, mockCover] + if (noAvatar) { + objectCreationList.shift() + } + if (noCover) { + objectCreationList.pop() + } + return createType('PalletContentStorageAssetsRecord', { + expectedDataSizeFee, + objectCreationList, + }) + } + + async run(): Promise { + const api = this.getOriginalApi() + const { + collaboratorsNum, + storageBucketsNum: forcedStorageBucketsNum, + distributionBucketsNum: forcedDistributionBucketsNum, + avatarSize: inputAvatarSize, + coverSize: inputCoverSize, + noAvatar, + noCover, + titleLen, + descriptionLen, + } = this.parse(FeeProfileCreateChannel).flags + const dataSizeFee = await this.getApi().dataObjectPerMegabyteFee() + const dataObjectBloatBond = await this.getApi().dataObjectStateBloatBond() + const channelBloatBond = await this.getApi().channelStateBloatBond() + + const channelBagPolicy = await api.query.storage.dynamicBagCreationPolicies('Channel') + const storageBucketsNum = forcedStorageBucketsNum || channelBagPolicy.numberOfStorageBuckets.toNumber() + const distributionBucketsNum = + forcedDistributionBucketsNum || + Array.from(channelBagPolicy.families.entries()).reduce((sum, curr) => (sum += curr[1].toNumber()), 0) + const avatarSize = noAvatar ? 0 : inputAvatarSize + const coverSize = noCover ? 0 : inputCoverSize + const assets = this.getAssets(dataSizeFee) + const assetsNum = assets?.objectCreationList.length || 0 + const assetsSizeMB = avatarSize + coverSize + + this.log(`Data fee per MB: ${chalk.cyanBright(formatBalance(dataSizeFee))}`) + this.log(`Data object bloat bond: ${chalk.cyanBright(formatBalance(dataObjectBloatBond))}`) + this.log(`Channel bloat bond: ${chalk.cyanBright(formatBalance(channelBloatBond))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + collaboratorsNum, + storageBucketsNum, + distributionBucketsNum, + titleLen, + descriptionLen, + assetsNum, + assetsSizeMB, + }) + ) + + const mockMetadata: IChannelMetadata = { + avatarPhoto: noAvatar ? undefined : 0, + coverPhoto: noCover ? undefined : 0, + language: 'en', + title: _.repeat('x', titleLen), + description: _.repeat('x', descriptionLen), + } + + const tx = api.tx.content.createChannel( + { Member: 0 }, + createType('PalletContentChannelCreationParametersRecord', { + expectedChannelStateBloatBond: channelBloatBond, + expectedDataObjectStateBloatBond: dataObjectBloatBond, + collaborators: new Map( + Array.from({ length: collaboratorsNum }, (v, k) => [ + k, + [] as PalletContentIterableEnumsChannelActionPermission[], + ]) + ), + assets, + storageBuckets: Array.from({ length: storageBucketsNum }, (v, k) => k), + distributionBuckets: Array.from({ length: distributionBucketsNum }, (v, k) => ({ + distributionBucketFamilyId: k, + distributionBucketIndex: k, + })), + meta: metadataToBytes(ChannelMetadata, mockMetadata), + }) + ) + const extraCosts = { + dataObjectsBloatBond: dataObjectBloatBond.muln(assetsNum), + dataObjectsSizeFee: dataSizeFee.muln(assetsSizeMB), + channelBloatBond, + } + await this.profile(tx, extraCosts) + } +} diff --git a/cli/src/commands/fee-profile/createForumThread.ts b/cli/src/commands/fee-profile/createForumThread.ts new file mode 100644 index 0000000000..e2e27844b1 --- /dev/null +++ b/cli/src/commands/fee-profile/createForumThread.ts @@ -0,0 +1,75 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { ForumThreadMetadata, IForumThreadMetadata } from '@joystream/metadata-protobuf' +import { metadataToBytes } from '../../helpers/serialization' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_TITLE_LENGTH = 20 +const DEFAULT_INITIAL_POST_LENGTH = 200 +const DEFAULT_TAGS_NUM = 5 +const DEFAULT_TAG_LENGTH = 10 + +export default class FeeProfileCreateForumThread extends FeeProfileCommandBase { + static description = 'Create fee profile of forum.create_thread extrinsic.' + + static flags = { + titleLen: flags.integer({ + char: 't', + default: DEFAULT_TITLE_LENGTH, + description: 'Thread title (part of thread metadata) length to use for estimating tx fee', + }), + initialPostLen: flags.integer({ + char: 'p', + default: DEFAULT_INITIAL_POST_LENGTH, + description: "Thread's initial post length to use for estimating tx fee", + }), + tagsNum: flags.integer({ + char: 'G', + default: DEFAULT_TAGS_NUM, + description: 'Number of forum thread tags (part of thread metadata) to use for estimating tx fee', + }), + tagLen: flags.integer({ + char: 'g', + default: DEFAULT_TAG_LENGTH, + description: 'Single tag length (part of thread metadata) to use for estimating tx fee', + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { titleLen, initialPostLen, tagsNum, tagLen } = this.parse(FeeProfileCreateForumThread).flags + const { threadDeposit, postDeposit } = api.consts.forum + + this.log(`Thread deposit: ${chalk.cyanBright(formatBalance(threadDeposit))}`) + this.log(`Post deposit: ${chalk.cyanBright(formatBalance(postDeposit))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + titleLen, + initialPostLen, + tagsNum, + tagLen, + }) + ) + + const mockMetadata: IForumThreadMetadata = { + title: _.repeat('x', titleLen), + tags: Array.from({ length: tagsNum }, () => _.repeat('x', tagLen)), + } + + const tx = api.tx.forum.createThread( + 0, + 0, + metadataToBytes(ForumThreadMetadata, mockMetadata), + _.repeat('x', initialPostLen) + ) + const extraCosts = { + threadDeposit, + postDeposit, + } + await this.profile(tx, extraCosts) + } +} diff --git a/cli/src/commands/fee-profile/createVideo.ts b/cli/src/commands/fee-profile/createVideo.ts new file mode 100644 index 0000000000..414e18deee --- /dev/null +++ b/cli/src/commands/fee-profile/createVideo.ts @@ -0,0 +1,218 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import _ from 'lodash' +import { VideoMetadata, IVideoMetadata } from '@joystream/metadata-protobuf' +import { metadataToBytes } from '../../helpers/serialization' +import { createType } from '@joystream/types' +import { PalletContentStorageAssetsRecord } from '@polkadot/types/lookup' +import BN from 'bn.js' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_MEDIA_SIZE_MB = 200 +const DEFAULT_THUMBNAIL_SIZE_MB = 1 +const DEFAULT_TITLE_LENGTH = 15 +const DEFAULT_DESCRIPTION_LENGTH = 200 +const DEFAULT_VIDEO_CATEGORY_LENGTH = 10 +const DEFAULT_SUBTITLES_NUM = 1 +const DEFAULT_SUBTITLES_FILE_SIZE_MB = 1 + +export default class FeeProfileCreateVideo extends FeeProfileCommandBase { + static description = 'Create fee profile of content.create_video extrinsic.' + + static flags = { + titleLen: flags.integer({ + char: 't', + default: DEFAULT_TITLE_LENGTH, + description: 'Video title (part of video metadata) length to use for estimating tx fee', + }), + descriptionLen: flags.integer({ + char: 'd', + default: DEFAULT_DESCRIPTION_LENGTH, + description: 'Video description (part of video metadata) length to use for estimating tx fee', + }), + categoryLen: flags.integer({ + char: 'c', + default: DEFAULT_VIDEO_CATEGORY_LENGTH, + description: 'Video cateogry (part of video metadata) length to use for estimating tx fee', + }), + subtitlesNum: flags.integer({ + char: 's', + default: DEFAULT_SUBTITLES_NUM, + description: 'Number of subtitles (subtitle assets) to use for estimating the costs', + }), + noMedia: flags.boolean({ + description: 'If provided - video with no media asset will be used for estimating the costs', + exclusive: ['mediaSize'], + }), + withNft: flags.boolean({ + description: 'If provided - `auto_issue_nft` parameter will be set when estimating tx fee', + }), + nftAuctionWhitelistSize: flags.integer({ + char: 'w', + description: + "If `--withNft` is provided - determines auction whitelist size in nft's InitTransactionalStatus to use when estimating tx fee (Default: 0)", + dependsOn: ['withNft'], + }), + noThumbnail: flags.boolean({ + description: 'If provided - video with no thumbnail asset will be used for estimating the costs', + exclusive: ['thumbnailSize'], + }), + mediaSize: flags.integer({ + required: false, + char: 'm', + default: DEFAULT_MEDIA_SIZE_MB, + description: 'Video media file size in MB to use for estimating the costs', + }), + thumbnailSize: flags.integer({ + char: 'T', + default: DEFAULT_THUMBNAIL_SIZE_MB, + description: 'Thumbnail photo size in MB to use for estimating the costs', + }), + subtitlesFileSize: flags.integer({ + char: 'f', + default: DEFAULT_SUBTITLES_FILE_SIZE_MB, + description: 'Single subtitles file/asset size in MB to use for estimating the costs', + }), + storageBucketsNum: flags.integer({ + char: 'S', + description: + 'Number of storage buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + ...super.flags, + } + + getAssets(expectedDataSizeFee: BN): PalletContentStorageAssetsRecord | null { + const { noThumbnail, noMedia, thumbnailSize, mediaSize, subtitlesNum, subtitlesFileSize } = + this.parse(FeeProfileCreateVideo).flags + if (noThumbnail && noMedia && subtitlesNum === 0) { + return null + } + const mockThumbnail = this.mockAsset(thumbnailSize) + const mockMedia = this.mockAsset(mediaSize) + const mockSubtitles = Array.from({ length: subtitlesNum }, () => this.mockAsset(subtitlesFileSize)) + const objectCreationList = [mockThumbnail, ...mockSubtitles, mockMedia] + if (noThumbnail) { + objectCreationList.shift() + } + if (noMedia) { + objectCreationList.pop() + } + return createType('PalletContentStorageAssetsRecord', { + expectedDataSizeFee, + objectCreationList, + }) + } + + async run(): Promise { + const api = this.getOriginalApi() + const { + storageBucketsNum: forcedStorageBucketsNum, + thumbnailSize: inputThumbnailSize, + mediaSize: inputMediaSize, + noThumbnail, + noMedia, + titleLen, + descriptionLen, + categoryLen, + subtitlesNum, + subtitlesFileSize, + withNft = false, + nftAuctionWhitelistSize, + } = this.parse(FeeProfileCreateVideo).flags + const dataSizeFee = await this.getApi().dataObjectPerMegabyteFee() + const dataObjectBloatBond = await this.getApi().dataObjectStateBloatBond() + const videoBloatBond = await this.getApi().videoStateBloatBond() + const mockMetadata: IVideoMetadata = { + thumbnailPhoto: noThumbnail ? undefined : 0, + video: noMedia ? undefined : 0, + language: 'en', + title: _.repeat('x', titleLen), + description: _.repeat('x', descriptionLen), + category: _.repeat('x', categoryLen), + license: { + code: 0, + }, + mediaPixelWidth: 1920, + mediaPixelHeight: 1080, + isExplicit: false, + isPublic: true, + duration: 600, + mediaType: { + codecName: 'h264', + container: 'mp4', + mimeMediaType: 'video/mp4', + }, + hasMarketing: false, + subtitles: Array.from({ length: subtitlesNum }, () => ({ + language: 'en', + mimeType: 'text/plain', + type: 'subtitle', + newAsset: 0, + })), + } + + const channelBagPolicy = await api.query.storage.dynamicBagCreationPolicies('Channel') + const storageBucketsNum = forcedStorageBucketsNum || channelBagPolicy.numberOfStorageBuckets.toNumber() + const mediaSize = noMedia ? 0 : inputMediaSize + const thumbnailSize = noThumbnail ? 0 : inputThumbnailSize + const assets = this.getAssets(dataSizeFee) + const assetsNum = assets?.objectCreationList.length || 0 + const assetsSizeMB = mediaSize + thumbnailSize + subtitlesNum * subtitlesFileSize + + this.log(`Data fee per MB: ${chalk.cyanBright(formatBalance(dataSizeFee))}`) + this.log(`Data object bloat bond: ${chalk.cyanBright(formatBalance(dataObjectBloatBond))}`) + this.log(`Video bloat bond: ${chalk.cyanBright(formatBalance(videoBloatBond))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + storageBucketsNum, + assetsNum, + subtitlesNum, + assetsSizeMB, + titleLen, + descriptionLen, + categoryLen, + withNft, + nftAuctionWhitelistSize, + }) + ) + + const tx = api.tx.content.createVideo( + { Member: 0 }, + 0, + createType('PalletContentVideoCreationParametersRecord', { + assets, + meta: metadataToBytes(VideoMetadata, mockMetadata), + autoIssueNft: withNft + ? createType('PalletContentNftTypesNftIssuanceParametersRecord', { + nftMetadata: '', + nonChannelOwner: null, + royalty: null, + initTransactionalStatus: { + EnglishAuction: { + duration: 0, + buyNowPrice: null, + extensionPeriod: 0, + minBidStep: 0, + startingPrice: 0, + startsAt: null, + whitelist: Array.from({ length: nftAuctionWhitelistSize || 0 }, (v, k) => k), + }, + }, + }) + : null, + storageBucketsNumWitness: storageBucketsNum, + expectedDataObjectStateBloatBond: dataObjectBloatBond, + expectedVideoStateBloatBond: videoBloatBond, + }) + ) + const extraCosts = { + dataObjectsBloatBond: dataObjectBloatBond.muln(assetsNum), + dataObjectsSizeFee: dataSizeFee.muln(assetsSizeMB), + videoBloatBond, + } + await this.profile(tx, extraCosts) + } +} diff --git a/cli/src/commands/fee-profile/deleteChannel.ts b/cli/src/commands/fee-profile/deleteChannel.ts new file mode 100644 index 0000000000..8c9b3a0568 --- /dev/null +++ b/cli/src/commands/fee-profile/deleteChannel.ts @@ -0,0 +1,75 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import { createType } from '@joystream/types' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_ASSETS_NUM = 2 + +export default class FeeProfileDeleteChannel extends FeeProfileCommandBase { + static description = 'Create fee profile of content.delete_channel extrinsic.' + + static flags = { + assetsNum: flags.integer({ + char: 'a', + default: DEFAULT_ASSETS_NUM, + description: 'Number of assets to use for estimating the costs/returns', + }), + distributionBucketsNum: flags.integer({ + char: 'D', + description: + 'Number of distribution buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + storageBucketsNum: flags.integer({ + char: 'S', + description: + 'Number of storage buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { + assetsNum, + storageBucketsNum: forcedStorageBucketsNum, + distributionBucketsNum: forcedDistributionBucketsNum, + } = this.parse(FeeProfileDeleteChannel).flags + const dataObjectBloatBond = await this.getApi().dataObjectStateBloatBond() + const channelBloatBond = await this.getApi().channelStateBloatBond() + + const channelBagPolicy = await api.query.storage.dynamicBagCreationPolicies('Channel') + const storageBucketsNum = forcedStorageBucketsNum || channelBagPolicy.numberOfStorageBuckets.toNumber() + const distributionBucketsNum = + forcedDistributionBucketsNum || + Array.from(channelBagPolicy.families.entries()).reduce((sum, curr) => (sum += curr[1].toNumber()), 0) + + this.log(`Data object bloat bond: ${chalk.cyanBright(formatBalance(dataObjectBloatBond))}`) + this.log(`Channel bloat bond: ${chalk.cyanBright(formatBalance(channelBloatBond))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + storageBucketsNum, + distributionBucketsNum, + assetsNum, + }) + ) + + const tx = api.tx.content.deleteChannel( + { Member: 0 }, + 0, + createType('PalletContentChannelBagWitness', { + storageBucketsNum, + distributionBucketsNum, + }), + assetsNum + ) + const returns = { + dataObjectsBloatBond: dataObjectBloatBond.muln(assetsNum), + channelBloatBond, + } + await this.profile(tx, undefined, returns) + } +} diff --git a/cli/src/commands/fee-profile/deleteForumPost.ts b/cli/src/commands/fee-profile/deleteForumPost.ts new file mode 100644 index 0000000000..55315a0f26 --- /dev/null +++ b/cli/src/commands/fee-profile/deleteForumPost.ts @@ -0,0 +1,44 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import _ from 'lodash' +import { flags } from '@oclif/command' +import { createType } from '@joystream/types' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_RATIONALE_LENGTH = 0 + +export default class FeeProfileDeleteForumPost extends FeeProfileCommandBase { + static description = 'Create fee profile of forum.delete_posts extrinsic (single post case).' + + static flags = { + rationaleLen: flags.integer({ + char: 'r', + default: DEFAULT_RATIONALE_LENGTH, + description: 'Default rationale length to use for estimating tx fee', + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { postDeposit } = api.consts.forum + const { rationaleLen } = this.parse(FeeProfileDeleteForumPost).flags + + this.log(`Post deposit: ${chalk.cyanBright(formatBalance(postDeposit))}`) + this.log('Parameters:') + this.jsonPrettyPrint(JSON.stringify({ rationaleLen })) + + const tx = api.tx.forum.deletePosts( + 0, + createType( + 'BTreeMap', + new Map([[createType('PalletForumExtendedPostIdObject', { categoryId: 0, threadId: 0, postId: 0 }), true]]) + ), + _.repeat('x', rationaleLen) + ) + const returns = { + postDeposit, + } + await this.profile(tx, undefined, returns) + } +} diff --git a/cli/src/commands/fee-profile/deleteForumThread.ts b/cli/src/commands/fee-profile/deleteForumThread.ts new file mode 100644 index 0000000000..84cf58ed71 --- /dev/null +++ b/cli/src/commands/fee-profile/deleteForumThread.ts @@ -0,0 +1,24 @@ +import { formatBalance } from '@polkadot/util' +import chalk from 'chalk' +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' + +export default class FeeProfileDeleteForumThread extends FeeProfileCommandBase { + static description = 'Create fee profile of forum.delete_thread extrinsic.' + + static flags = { + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { threadDeposit } = api.consts.forum + + this.log(`Thread deposit: ${chalk.cyanBright(formatBalance(threadDeposit))}`) + + const tx = api.tx.forum.deleteThread(0, 0, 0, true) + const returns = { + threadDeposit, + } + await this.profile(tx, undefined, returns) + } +} diff --git a/cli/src/commands/fee-profile/deleteVideo.ts b/cli/src/commands/fee-profile/deleteVideo.ts new file mode 100644 index 0000000000..06b87ec9a5 --- /dev/null +++ b/cli/src/commands/fee-profile/deleteVideo.ts @@ -0,0 +1,53 @@ +import FeeProfileCommandBase from '../../base/FeeProfileCommandBase' +import { flags } from '@oclif/command' +import { createType } from '@joystream/types' +import chalk from 'chalk' +import { formatBalance } from '@polkadot/util' + +const DEFAULT_ASSETS_NUM = 2 + +export default class FeeProfileDeleteVideo extends FeeProfileCommandBase { + static description = 'Create fee profile of forum.delete_video extrinsic.' + + static flags = { + assetsNum: flags.integer({ + char: 'a', + default: DEFAULT_ASSETS_NUM, + description: 'Number of assets to use for estimating the costs/returns', + }), + storageBucketsNum: flags.integer({ + char: 'S', + description: + 'Number of storage buckets to use for estimating tx fee.\n' + + "By default this number will be based on the current chain's dynamic bag policy for channel bags", + }), + ...super.flags, + } + + async run(): Promise { + const api = this.getOriginalApi() + const { assetsNum, storageBucketsNum: forcedStorageBucketsNum } = this.parse(FeeProfileDeleteVideo).flags + const dataObjectBloatBond = await this.getApi().dataObjectStateBloatBond() + const videoBloatBond = await this.getApi().videoStateBloatBond() + + const channelBagPolicy = await api.query.storage.dynamicBagCreationPolicies('Channel') + const storageBucketsNum = forcedStorageBucketsNum || channelBagPolicy.numberOfStorageBuckets.toNumber() + + this.log(`Data object bloat bond: ${chalk.cyanBright(formatBalance(dataObjectBloatBond))}`) + this.log(`Video bloat bond: ${chalk.cyanBright(formatBalance(videoBloatBond))}`) + this.log('Parameters:') + this.jsonPrettyPrint( + JSON.stringify({ + storageBucketsNum, + assetsNum, + }) + ) + + const tx = api.tx.content.deleteVideo({ Member: 0 }, 0, assetsNum, createType('Option', storageBucketsNum)) + const returns = { + dataObjectsBloatBond: dataObjectBloatBond.muln(assetsNum), + videoBloatBond, + } + await this.profile(tx, undefined, returns) + } +} diff --git a/cli/src/commands/forum/addPost.ts b/cli/src/commands/forum/addPost.ts index 32ddb112fd..a6860fb097 100644 --- a/cli/src/commands/forum/addPost.ts +++ b/cli/src/commands/forum/addPost.ts @@ -3,7 +3,7 @@ import chalk from 'chalk' import ForumCommandBase from '../../base/ForumCommandBase' import { ForumPostMetadata, IForumPostMetadata } from '@joystream/metadata-protobuf' import { metadataToBytes } from '../../helpers/serialization' -import { PostId } from '@joystream/types/common' +import { ForumPostId as PostId } from '@joystream/types/primitives' export default class ForumAddPostCommand extends ForumCommandBase { static description = 'Add forum post.' @@ -41,7 +41,7 @@ export default class ForumAddPostCommand extends ForumCommandBase { await this.requireConfirmation('Do you confirm the provided input?', true) const result = await this.sendAndFollowTx( - await this.getDecodedPair(member.membership.controller_account), + await this.getDecodedPair(member.membership.controllerAccount), api.tx.forum.addPost(member.id, categoryId, threadId, metadataToBytes(ForumPostMetadata, metadata), editable) ) diff --git a/cli/src/commands/forum/categories.ts b/cli/src/commands/forum/categories.ts index 9989588dd6..a8214855e6 100644 --- a/cli/src/commands/forum/categories.ts +++ b/cli/src/commands/forum/categories.ts @@ -1,4 +1,5 @@ -import { Category, CategoryId } from '@joystream/types/forum' +import { ForumCategoryId as CategoryId } from '@joystream/types/primitives' +import { PalletForumCategory as Category } from '@polkadot/types/lookup' import { flags } from '@oclif/command' import { cli } from 'cli-ux' import chalk from 'chalk' @@ -30,7 +31,7 @@ export default class ForumCategoriesCommand extends ForumCommandBase { allCategories: [CategoryId, Category][] ): void { for (const [parentId] of parents) { - const children = allCategories.filter(([, c]) => c.parent_category_id.unwrapOr(undefined)?.eq(parentId)) + const children = allCategories.filter(([, c]) => c.parentCategoryId.unwrapOr(undefined)?.eq(parentId)) const childSubtree = cli.tree() this.recursivelyGenerateCategoryTree(childSubtree, children, allCategories) tree.insert(parentId.toString(), childSubtree) @@ -46,7 +47,7 @@ export default class ForumCategoriesCommand extends ForumCommandBase { this.error(`Category ${chalk.magentaBright(root)} not found!`) } } - const treeRootCategories = rootCategory ? [rootCategory] : categories.filter(([, c]) => c.parent_category_id.isNone) + const treeRootCategories = rootCategory ? [rootCategory] : categories.filter(([, c]) => c.parentCategoryId.isNone) this.recursivelyGenerateCategoryTree(tree, treeRootCategories, categories) return tree } @@ -65,15 +66,15 @@ export default class ForumCategoriesCommand extends ForumCommandBase { categoryTree.display() } else { const children = categories.filter( - ([, c]) => c.parent_category_id.unwrapOr(undefined)?.toNumber() === parentCategoryId + ([, c]) => c.parentCategoryId.unwrapOr(undefined)?.toNumber() === parentCategoryId ) if (children.length) { displayTable( children.map(([id, c]) => ({ 'ID': id.toString(), - 'Direct subcategories': c.num_direct_subcategories.toNumber(), - 'Direct threads': c.num_direct_threads.toNumber(), - 'Direct modreators': c.num_direct_moderators.toNumber(), + 'Direct subcategories': c.numDirectSubcategories.toNumber(), + 'Direct threads': c.numDirectThreads.toNumber(), + 'Direct modreators': c.numDirectModerators.toNumber(), })), 5 ) diff --git a/cli/src/commands/forum/category.ts b/cli/src/commands/forum/category.ts index e112183680..740f8aae1a 100644 --- a/cli/src/commands/forum/category.ts +++ b/cli/src/commands/forum/category.ts @@ -1,4 +1,4 @@ -import { CategoryId } from '@joystream/types/forum' +import { ForumCategoryId as CategoryId } from '@joystream/types/primitives' import { flags } from '@oclif/command' import chalk from 'chalk' import ForumCommandBase from '../../base/ForumCommandBase' @@ -21,7 +21,7 @@ export default class ForumCategoryCommand extends ForumCommandBase { const category = await this.getCategory(categoryId) const allCategories = await this.getApi().forumCategories() const directSubcategories = allCategories.filter( - ([, c]) => c.parent_category_id.unwrapOr(undefined)?.toNumber() === categoryId + ([, c]) => c.parentCategoryId.unwrapOr(undefined)?.toNumber() === categoryId ) const moderatorsEntries = await this.getApi().forumCategoryModerators(categoryId) const moderators = await Promise.all( @@ -33,14 +33,18 @@ export default class ForumCategoryCommand extends ForumCommandBase { displayCollapsedRow({ 'ID': categoryId.toString(), - 'No. direct subcategories': category.num_direct_subcategories.toString(), - 'No. direct threads': category.num_direct_threads.toString(), - 'No. direct moderators': category.num_direct_moderators.toString(), + 'No. direct subcategories': category.numDirectSubcategories.toString(), + 'No. direct threads': category.numDirectThreads.toString(), + 'No. direct moderators': category.numDirectModerators.toString(), }) displayHeader('Stickied threads') - if (category.sticky_thread_ids.length) { - this.log(category.sticky_thread_ids.map((id) => chalk.magentaBright(id.toString())).join(', ')) + if (category.stickyThreadIds.size) { + this.log( + Array.from(category.stickyThreadIds.values()) + .map((id) => chalk.magentaBright(id.toString())) + .join(', ') + ) } else { this.log('No stickied threads') } diff --git a/cli/src/commands/forum/createCategory.ts b/cli/src/commands/forum/createCategory.ts index 16f16f5ce9..e0c9d3145e 100644 --- a/cli/src/commands/forum/createCategory.ts +++ b/cli/src/commands/forum/createCategory.ts @@ -1,9 +1,8 @@ import { createType } from '@joystream/types' -import { CategoryId } from '@joystream/types/forum' +import { ForumCategoryId as CategoryId } from '@joystream/types/primitives' import { flags } from '@oclif/command' import chalk from 'chalk' import ForumCommandBase from '../../base/ForumCommandBase' -import { Option } from '@polkadot/types' export default class ForumCreateCategoryCommand extends ForumCommandBase { static description = 'Create forum category.' @@ -41,11 +40,7 @@ export default class ForumCreateCategoryCommand extends ForumCommandBase { const result = await this.sendAndFollowTx( await this.getDecodedPair(lead.roleAccount), - api.tx.forum.createCategory( - createType, 'Option'>('Option', parentCategoryId ?? null), - title, - description - ) + api.tx.forum.createCategory(createType('Option', parentCategoryId ?? null), title, description) ) const categoryId: CategoryId = this.getEvent(result, 'forum', 'CategoryCreated').data[0] diff --git a/cli/src/commands/forum/createThread.ts b/cli/src/commands/forum/createThread.ts index 2873eb12a1..66aaf984d7 100644 --- a/cli/src/commands/forum/createThread.ts +++ b/cli/src/commands/forum/createThread.ts @@ -3,7 +3,7 @@ import chalk from 'chalk' import ForumCommandBase from '../../base/ForumCommandBase' import { ForumThreadMetadata, IForumThreadMetadata } from '@joystream/metadata-protobuf' import { metadataToBytes } from '../../helpers/serialization' -import { ThreadId } from '@joystream/types/common' +import { ForumThreadId as ThreadId } from '@joystream/types/primitives' export default class ForumCreateThreadCommand extends ForumCommandBase { static description = 'Create forum thread.' @@ -40,9 +40,8 @@ export default class ForumCreateThreadCommand extends ForumCommandBase { await this.requireConfirmation('Do you confirm the provided input?', true) const result = await this.sendAndFollowTx( - await this.getDecodedPair(member.membership.controller_account), - // Polls not supported atm - api.tx.forum.createThread(member.id, categoryId, metadataToBytes(ForumThreadMetadata, metadata), text, null) + await this.getDecodedPair(member.membership.controllerAccount), + api.tx.forum.createThread(member.id, categoryId, metadataToBytes(ForumThreadMetadata, metadata), text) ) const threadId: ThreadId = this.getEvent(result, 'forum', 'ThreadCreated').data[1] diff --git a/cli/src/commands/forum/deleteCategory.ts b/cli/src/commands/forum/deleteCategory.ts index 43e4f8cc6b..5e2f3f5b98 100644 --- a/cli/src/commands/forum/deleteCategory.ts +++ b/cli/src/commands/forum/deleteCategory.ts @@ -1,5 +1,5 @@ -import { AccountId } from '@joystream/types/common' -import { PrivilegedActor } from '@joystream/types/forum' +import { AccountId } from '@polkadot/types/interfaces' +import { PalletForumPrivilegedActor as PrivilegedActor } from '@polkadot/types/lookup' import { flags } from '@oclif/command' import chalk from 'chalk' import ForumCommandBase from '../../base/ForumCommandBase' @@ -24,20 +24,20 @@ export default class ForumDeleteCategoryCommand extends ForumCommandBase { const category = await this.getCategory(categoryId) let key: AccountId, actor: PrivilegedActor - if (category.parent_category_id.isNone) { + if (category.parentCategoryId.isNone) { if (context === 'Moderator') { this.error('Moderator cannot delete root categories!', { exit: ExitCodes.AccessDenied }) } ;[key, actor] = await this.getForumLeadContext() } else { - ;[key, actor] = await this.getForumModerationContext([category.parent_category_id.unwrap()], context) + ;[key, actor] = await this.getForumModerationContext([category.parentCategoryId.unwrap()], context) } - if (category.num_direct_subcategories.gtn(0)) { + if (category.numDirectSubcategories.gtn(0)) { this.error('Cannot remove a category with existing subcategories!', { exit: ExitCodes.InvalidInput }) } - if (category.num_direct_threads.gtn(0)) { + if (category.numDirectThreads.gtn(0)) { this.error('Cannot remove a category with existing threads!', { exit: ExitCodes.InvalidInput }) } diff --git a/cli/src/commands/forum/moderatePost.ts b/cli/src/commands/forum/moderatePost.ts index 89deb4a17f..5d17e6be0a 100644 --- a/cli/src/commands/forum/moderatePost.ts +++ b/cli/src/commands/forum/moderatePost.ts @@ -41,7 +41,7 @@ export default class ForumModeratePostCommand extends ForumCommandBase { const [key, actor] = await this.getForumModerationContext([categoryId], context) this.jsonPrettyPrint(JSON.stringify({ categoryId, threadId, postId, rationale })) - this.warn(`Post stake of ${formatBalance(post.cleanup_pay_off)} will be slashed!`) + this.warn(`Post stake of ${formatBalance(post.cleanupPayOff.amount)} will be slashed!`) await this.requireConfirmation('Do you confirm the provided input?', true) await this.sendAndFollowTx( diff --git a/cli/src/commands/forum/moderateThread.ts b/cli/src/commands/forum/moderateThread.ts index bfc1436576..55f93a8c1f 100644 --- a/cli/src/commands/forum/moderateThread.ts +++ b/cli/src/commands/forum/moderateThread.ts @@ -26,14 +26,20 @@ export default class ForumModerateThreadCommand extends ForumCommandBase { } async run(): Promise { - const api = await this.getOriginalApi() + const api = this.getOriginalApi() const { categoryId, threadId, context, rationale } = this.parse(ForumModerateThreadCommand).flags const thread = await this.getThread(categoryId, threadId) const [key, actor] = await this.getForumModerationContext([categoryId], context) this.jsonPrettyPrint(JSON.stringify({ categoryId, threadId, rationale })) - this.warn(`Thread stake of ${formatBalance(thread.cleanup_pay_off)} will be slashed!`) + this.warn(`Thread stake of ${formatBalance(thread.cleanupPayOff.amount)} will be slashed!`) + if (thread.numberOfEditablePosts) { + this.error( + `Thread with existing editable posts cannot be deleted. Editable posts count: ${thread.numberOfEditablePosts}` + ) + } + await this.requireConfirmation('Do you confirm the provided input?', true) await this.sendAndFollowTx( diff --git a/cli/src/commands/forum/posts.ts b/cli/src/commands/forum/posts.ts index 9438234804..151e9cdeb6 100644 --- a/cli/src/commands/forum/posts.ts +++ b/cli/src/commands/forum/posts.ts @@ -24,9 +24,9 @@ export default class ForumPostsCommand extends ForumCommandBase { displayTable( posts.map(([id, p]) => ({ 'ID': id.toString(), - 'Cleanup payoff': formatBalance(p.cleanup_pay_off), - 'Author member id': p.author_id.toString(), - 'Last edited': `#${p.last_edited.toNumber()}`, + 'Cleanup payoff': formatBalance(p.cleanupPayOff.amount), + 'Author member id': p.authorId.toString(), + 'Last edited': `#${p.lastEdited.toNumber()}`, })), 5 ) diff --git a/cli/src/commands/forum/setStickiedThreads.ts b/cli/src/commands/forum/setStickiedThreads.ts index 4ccc9c5bae..be9ac1b2fb 100644 --- a/cli/src/commands/forum/setStickiedThreads.ts +++ b/cli/src/commands/forum/setStickiedThreads.ts @@ -32,7 +32,7 @@ export default class ForumSetStickiedThreadsCommand extends ForumCommandBase { await this.sendAndFollowTx( await this.getDecodedPair(key), - api.tx.forum.setStickiedThreads(actor, categoryId, threadIds) + api.tx.forum.setStickiedThreads(actor, categoryId, this.createType('BTreeSet', threadIds)) ) this.log( diff --git a/cli/src/commands/forum/threads.ts b/cli/src/commands/forum/threads.ts index a8923e97ab..04a856a889 100644 --- a/cli/src/commands/forum/threads.ts +++ b/cli/src/commands/forum/threads.ts @@ -25,9 +25,9 @@ export default class ForumThreadsCommand extends ForumCommandBase { displayTable( threads.map(([id, t]) => ({ 'ID': id.toString(), - 'Cleanup payoff': formatBalance(t.cleanup_pay_off), - 'Author member id': t.author_id.toString(), - 'No. posts': t.number_of_posts.toString(), + 'Cleanup payoff': formatBalance(t.cleanupPayOff.amount), + 'Author member id': t.authorId.toString(), + 'No. editable posts': t.numberOfEditablePosts.toString(), })), 5 ) diff --git a/cli/src/commands/membership/buy.ts b/cli/src/commands/membership/buy.ts index 10d5cba2ac..73c758fc54 100644 --- a/cli/src/commands/membership/buy.ts +++ b/cli/src/commands/membership/buy.ts @@ -75,8 +75,8 @@ export default class MembershipBuyCommand extends AccountsCommandBase { const result = await this.sendAndFollowTx( await this.getDecodedPair(senderKey), api.tx.members.buyMembership({ - root_account: rootKey, - controller_account: controllerKey, + rootAccount: rootKey, + controllerAccount: controllerKey, handle, metadata: metadataToBytes(MembershipMetadata, metadata), }) diff --git a/cli/src/commands/membership/details.ts b/cli/src/commands/membership/details.ts index 5d3e1123cf..67cbef382a 100644 --- a/cli/src/commands/membership/details.ts +++ b/cli/src/commands/membership/details.ts @@ -35,8 +35,8 @@ export default class MembershipDetailsCommand extends AccountsCommandBase { displayHeader('Keys') displayCollapsedRow({ - 'Root': details.membership.root_account.toString(), - 'Controller': details.membership.controller_account.toString(), + 'Root': details.membership.rootAccount.toString(), + 'Controller': details.membership.controllerAccount.toString(), }) } } diff --git a/cli/src/commands/membership/memberRemark.ts b/cli/src/commands/membership/memberRemark.ts new file mode 100644 index 0000000000..fe13e1f73a --- /dev/null +++ b/cli/src/commands/membership/memberRemark.ts @@ -0,0 +1,27 @@ +import chalk from 'chalk' +import MembershipsCommandBase from '../../base/MembershipsCommandBase' + +export default class MemberRemarkCommand extends MembershipsCommandBase { + static description = 'Member remarks' + static args = [ + { + name: 'message', + required: true, + description: 'Remark message', + }, + ] + + static flags = { + ...MembershipsCommandBase.flags, + } + + async run(): Promise { + const { message } = this.parse(MemberRemarkCommand).args + const { id: memberId, membership } = await this.getRequiredMemberContext(true) + const keypair = await this.getDecodedPair(membership.controllerAccount) + + await this.sendAndFollowNamedTx(keypair, 'members', 'memberRemark', [memberId, message]) + + this.log(chalk.green(`Member remarked successfully`)) + } +} diff --git a/cli/src/commands/membership/update.ts b/cli/src/commands/membership/update.ts index 1e277f97eb..5a4dc3b9d3 100644 --- a/cli/src/commands/membership/update.ts +++ b/cli/src/commands/membership/update.ts @@ -31,7 +31,7 @@ export default class MembershipUpdateCommand extends MembershipsCommandBase { const { newHandle, newName, newAvatarUri, newAbout } = this.parse(MembershipUpdateCommand).flags const { id: memberId, - membership: { controller_account: controllerKey }, + membership: { controllerAccount: controllerKey }, } = await this.getRequiredMemberContext() const newMetadata: IMembershipMetadata | null = diff --git a/cli/src/commands/membership/updateAccounts.ts b/cli/src/commands/membership/updateAccounts.ts index a2397ab633..df60c9fc1a 100644 --- a/cli/src/commands/membership/updateAccounts.ts +++ b/cli/src/commands/membership/updateAccounts.ts @@ -21,7 +21,7 @@ export default class MembershipUpdateAccountsCommand extends MembershipsCommandB const { newControllerAccount, newRootAccount } = this.parse(MembershipUpdateAccountsCommand).flags const { id: memberId, - membership: { root_account: rootKey }, + membership: { rootAccount: rootKey }, } = await this.getRequiredMemberContext(false, undefined, 'root') this.jsonPrettyPrint(JSON.stringify({ memberId, newControllerAccount, newRootAccount })) diff --git a/cli/src/commands/sign-offline/signUnsignedTx.ts b/cli/src/commands/sign-offline/signUnsignedTx.ts new file mode 100644 index 0000000000..79c5495ac0 --- /dev/null +++ b/cli/src/commands/sign-offline/signUnsignedTx.ts @@ -0,0 +1,152 @@ +import SignOfflineCommandBase from '../../base/SignOfflineCommandBase' +import { flags } from '@oclif/command' +import ExitCodes from '../../ExitCodes' +import { JOYSTREAM_ADDRESS_PREFIX, registry } from '@joystream/types' +import { IOFlags, ensureOutputFileIsWriteable, getInputJson, saveOutputJsonToFile } from '../../helpers/InputOutput' +import { decodeSignedTx } from '@substrate/txwrapper-core/lib/core/decode/decodeSignedTx' +import { decodeSigningPayload } from '@substrate/txwrapper-core/lib/core/decode/decodeSigningPayload' +import { Keyring } from '@polkadot/api' +// import { waitReady } from '@polkadot/wasm-crypto' +import { initWasm } from '@polkadot/wasm-crypto/initOnlyAsm' +import { KeyringOptions, KeyringPair, KeyringPair$Json } from '@polkadot/keyring/types' +import { createSignedTx, getTxHash } from '@substrate/txwrapper-core/lib/core/construct' +import { KeypairType } from '@polkadot/util-crypto/types' +import { DEFAULT_ACCOUNT_TYPE } from '../../base/AccountsCommandBase' +import { u8aToHex } from '@polkadot/util' + +export default class SignUnsignedTxCommand extends SignOfflineCommandBase { + static description = 'Sign an unsigned transaction. Does not require an api connection.' + static flags = { + input: IOFlags.input, + output: flags.string({ + char: 'o', + required: false, + description: + 'Path to the file where the JSON with full transaction details should be saved.' + + 'If omitted, only the signed transaction, the signature and the tx hash is included', + }), + mnemonic: flags.string({ + required: false, + description: 'Mnemonic phrase', + exclusive: ['backupFilePath', 'seed', 'suri'], + }), + seed: flags.string({ + required: false, + description: 'Secret seed', + exclusive: ['backupFilePath', 'mnemonic', 'suri'], + }), + backupFilePath: flags.string({ + required: false, + description: 'Path to account backup JSON file', + exclusive: ['mnemonic', 'seed', 'suri'], + }), + suri: flags.string({ + required: false, + description: 'Substrate uri', + exclusive: ['mnemonic', 'seed', 'backupFilePath'], + }), + password: flags.string({ + required: false, + description: `Account password`, + dependsOn: ['backupFilePath', 'suri'], + }), + keypairType: flags.enum({ + required: false, + default: DEFAULT_ACCOUNT_TYPE, + description: `Account type (defaults to ${DEFAULT_ACCOUNT_TYPE})`, + options: ['sr25519', 'ed25519', 'ecdsa'], + exclusive: ['backupFilePath'], + }), + } + + async run(): Promise { + const { + flags: { input, output, mnemonic, seed, backupFilePath, suri, keypairType }, + } = this.parse(SignUnsignedTxCommand) + + ensureOutputFileIsWriteable(output) + + if (!input) { + this.error('Could not fetch the input json', { exit: ExitCodes.InvalidFile }) + } + const keyringOptions: KeyringOptions = { + ss58Format: JOYSTREAM_ADDRESS_PREFIX, + type: keypairType, + } + const inputFile = await this.getInputFromFile(input) + const keyring = new Keyring(keyringOptions) + const txSignerAddress = keyring.addFromAddress(inputFile.unsigned.address) + + let signerPair: KeyringPair | undefined + + if (this.isKeyAvailable(keyring, txSignerAddress.address)) { + this.log('Signer key available in storage') + signerPair = this.getPair(keyring, txSignerAddress.address) as KeyringPair + } + if (mnemonic) { + signerPair = keyring.addFromMnemonic(mnemonic, {}, keypairType) + } else if (seed) { + signerPair = keyring.addFromSeed(Buffer.from(seed), {}, keypairType) + } else if (suri) { + signerPair = keyring.addFromUri(suri, {}, keypairType) + } else if (backupFilePath) { + const jsonPair = await getInputJson(backupFilePath) + signerPair = keyring.addFromJson(jsonPair) + } else { + this.error('Signer key not available in storage, and no input provided', { + exit: ExitCodes.NoAccountFound, + }) + } + this.log(`Signer key ${keyring.encodeAddress(signerPair.address, JOYSTREAM_ADDRESS_PREFIX)} is loaded.`) + + if (signerPair.address !== txSignerAddress.address) { + this.error( + `The input provided corresponds to ${signerPair.address}, whereas the signer address is ${txSignerAddress.address}`, + { + exit: ExitCodes.NoAccountFound, + } + ) + } + if (signerPair.isLocked) { + await this.requestPairDecoding(signerPair) + } + + const metadata = inputFile.unsigned.metadataRpc.slice(2) + await initWasm() + + const signingPayloadDecoded = decodeSigningPayload(inputFile.signingPayload, { + metadataRpc: `0x${metadata}`, + registry, + }) + if (signingPayloadDecoded.method.pallet === 'multisig' && inputFile.multisigTxData) { + this.multiCheck(signerPair.address, signingPayloadDecoded, inputFile.multisigTxData) + } + const encodePayload = await this.createPayloadV4(inputFile.signingPayload) + const signature = u8aToHex(encodePayload.sign(signerPair)) + + const signedTx = createSignedTx(inputFile.unsigned, signature, { metadataRpc: `0x${metadata}`, registry }) + + const txInfo = decodeSignedTx(signedTx, { metadataRpc: `0x${metadata}`, registry }) + const txHash = getTxHash(signedTx) + + const outputJson = { + signedTx, + signature, + unsignedTransaction: inputFile.unsigned, + signingPayload: inputFile.signingPayload, + txInfo, + txHash, + } + + this.log(`The transaction has been signed.\n` + ` - Signature: ${signature}\n` + ` - TX Hash: ${txHash}\n`) + if (signedTx.length > 500) { + this.log(`The signed TX too long to log to console - see output file`) + } else { + this.log(` - Signed TX: ${signedTx}`) + } + + if (output) { + saveOutputJsonToFile(output, outputJson) + } + } +} diff --git a/cli/src/commands/staking/validate.ts b/cli/src/commands/staking/validate.ts index 8dbdcc317f..1618b2c070 100644 --- a/cli/src/commands/staking/validate.ts +++ b/cli/src/commands/staking/validate.ts @@ -25,7 +25,7 @@ export default class StakingValidateCommand extends StakingCommandBase { } else { await this.isController(controller) } - await this.checkElectionStatus() + // await this.checkElectionStatus() await this.sendAndFollowNamedTx(await this.getDecodedPair(controller), 'staking', 'validate', [validatorPrefs]) } } diff --git a/cli/src/commands/working-groups/application.ts b/cli/src/commands/working-groups/application.ts index d49f3d6efd..9f8a1b4dc1 100644 --- a/cli/src/commands/working-groups/application.ts +++ b/cli/src/commands/working-groups/application.ts @@ -26,7 +26,7 @@ export default class WorkingGroupsApplication extends WorkingGroupsCommandBase { 'Application ID': application.applicationId, 'Opening ID': application.openingId.toString(), 'Member handle': memberHandle(application.member), - 'Role account': application.roleAccout.toString(), + 'Role account': application.roleAccount.toString(), 'Reward account': application.rewardAccount.toString(), 'Staking account': application.stakingAccount.toString(), } diff --git a/cli/src/commands/working-groups/apply.ts b/cli/src/commands/working-groups/apply.ts index 3ce0e219b0..af2f20c7bc 100644 --- a/cli/src/commands/working-groups/apply.ts +++ b/cli/src/commands/working-groups/apply.ts @@ -1,8 +1,7 @@ import WorkingGroupsCommandBase from '../../base/WorkingGroupsCommandBase' -import { Option } from '@polkadot/types' import { apiModuleByGroup } from '../../Api' -import { CreateInterface } from '@joystream/types' -import { ApplicationId, StakeParameters } from '@joystream/types/working-group' +import { createType } from '@joystream/types' +import { ApplicationId } from '@joystream/types/primitives' import { flags } from '@oclif/command' import ExitCodes from '../../ExitCodes' import { metadataToBytes } from '../../helpers/serialization' @@ -50,31 +49,28 @@ export default class WorkingGroupsApply extends WorkingGroupsCommandBase { rewardAccount = await this.promptForAnyAddress('Choose reward account') } - let stakeParams: CreateInterface> = null const stakeLockId = this.getOriginalApi().consts[apiModuleByGroup[this.group]].stakingHandlerLockId - if (opening.stake) { - if (!stakingAccount) { - stakingAccount = await this.promptForStakingAccount( - opening.stake.value, - memberContext.id, - memberContext.membership, - stakeLockId - ) - } else { - await this.setupStakingAccount( - memberContext.id, - memberContext.membership, - stakingAccount, - opening.stake.value, - undefined, - stakeLockId - ) - } + if (!stakingAccount) { + stakingAccount = await this.promptForStakingAccount( + opening.stake.value, + memberContext.id, + memberContext.membership, + stakeLockId + ) + } else { + await this.setupStakingAccount( + memberContext.id, + memberContext.membership, + stakingAccount, + opening.stake.value, + undefined, + stakeLockId + ) + } - stakeParams = { - stake: opening.stake.value, - staking_account_id: stakingAccount, - } + const stakeParams = { + stake: opening.stake.value, + stakingAccountId: stakingAccount, } let applicationFormAnswers = (answers || []).map((answer, i) => ({ question: `Question ${i}`, answer })) @@ -107,22 +103,22 @@ export default class WorkingGroupsApply extends WorkingGroupsCommandBase { await this.requireConfirmation('Do you confirm the provided input?') const result = await this.sendAndFollowNamedTx( - await this.getDecodedPair(memberContext.membership.controller_account.toString()), + await this.getDecodedPair(memberContext.membership.controllerAccount.toString()), apiModuleByGroup[this.group], 'applyOnOpening', [ - this.createType('ApplyOnOpeningParameters', { - member_id: memberContext.id, - opening_id: openingId, - role_account_id: roleAccount, - reward_account_id: rewardAccount, - stake_parameters: stakeParams, + createType('PalletWorkingGroupApplyOnOpeningParams', { + memberId: memberContext.id, + openingId: openingId, + roleAccountId: roleAccount, + rewardAccountId: rewardAccount, + stakeParameters: stakeParams, description: metadataToBytes(ApplicationMetadata, { answers }), }), ] ) const applicationId: ApplicationId = this.getEvent(result, apiModuleByGroup[this.group], 'AppliedOnOpening').data[1] - this.log(chalk.greenBright(`Application with id ${chalk.magentaBright(applicationId)} succesfully created!`)) + this.log(chalk.greenBright(`Application with id ${chalk.magentaBright(applicationId)} successfully created!`)) this.output(applicationId.toString()) } } diff --git a/cli/src/commands/working-groups/createOpening.ts b/cli/src/commands/working-groups/createOpening.ts index 1522c74084..bfbf448952 100644 --- a/cli/src/commands/working-groups/createOpening.ts +++ b/cli/src/commands/working-groups/createOpening.ts @@ -17,7 +17,7 @@ import { WorkingGroupMetadataAction, } from '@joystream/metadata-protobuf' import { metadataToBytes } from '../../helpers/serialization' -import { OpeningId } from '@joystream/types/working-group' +import { OpeningId } from '@joystream/types/primitives' import Long from 'long' import moment from 'moment' import { UpcomingWorkingGroupOpeningDetailsFragment } from '../../graphql/generated/queries' @@ -79,8 +79,8 @@ export default class WorkingGroupsCreateOpening extends WorkingGroupsCommandBase metadataToBytes(OpeningMetadata, this.prepareMetadata(openingParamsJson)), 'Regular', { - stake_amount: openingParamsJson.stakingPolicy.amount, - leaving_unstaking_period: openingParamsJson.stakingPolicy.unstakingPeriod, + stakeAmount: openingParamsJson.stakingPolicy.amount, + leavingUnstakingPeriod: openingParamsJson.stakingPolicy.unstakingPeriod, }, // TODO: Proper bigint handling? openingParamsJson.rewardPerBlock?.toString() || null, @@ -90,9 +90,10 @@ export default class WorkingGroupsCreateOpening extends WorkingGroupsCommandBase async promptForData( rememberedInput?: WorkingGroupOpeningInputParameters ): Promise { + const api = this.getOriginalApi() const openingDefaults = rememberedInput const openingPrompt = new JsonSchemaPrompter( - WorkingGroupOpeningInputSchema, + WorkingGroupOpeningInputSchema(api), openingDefaults ) const openingParamsJson = await openingPrompt.promptAll() @@ -101,7 +102,8 @@ export default class WorkingGroupsCreateOpening extends WorkingGroupsCommandBase } async getInputFromFile(filePath: string): Promise { - return getInputJson(filePath, WorkingGroupOpeningInputSchema) + const api = this.getOriginalApi() + return getInputJson(filePath, WorkingGroupOpeningInputSchema(api)) } async promptForStakeTopUp({ stake, stakingAccount }: GroupMember, fundsSource?: string): Promise { diff --git a/cli/src/commands/working-groups/fillOpening.ts b/cli/src/commands/working-groups/fillOpening.ts index 9fe7f1645e..027e1e9814 100644 --- a/cli/src/commands/working-groups/fillOpening.ts +++ b/cli/src/commands/working-groups/fillOpening.ts @@ -35,7 +35,7 @@ export default class WorkingGroupsFillOpening extends WorkingGroupsCommandBase { await this.getDecodedPair(lead.roleAccount), apiModuleByGroup[this.group], 'fillOpening', - [openingId, createType('BTreeSet', applicationIds)] + [openingId, createType('BTreeSet', applicationIds)] ) this.log(chalk.green(`Opening ${chalk.magentaBright(openingId.toString())} successfully filled!`)) diff --git a/cli/src/commands/working-groups/opening.ts b/cli/src/commands/working-groups/opening.ts index ecd03928a9..25e354cf60 100644 --- a/cli/src/commands/working-groups/opening.ts +++ b/cli/src/commands/working-groups/opening.ts @@ -81,7 +81,7 @@ export default class WorkingGroupsOpening extends WorkingGroupsCommandBase { const applicationsRows = opening.applications.map((a) => ({ 'ID': a.applicationId, Member: memberHandle(a.member), - 'Role Acc': shortAddress(a.roleAccout), + 'Role Acc': shortAddress(a.roleAccount), 'Reward Acc': shortAddress(a.rewardAccount), 'Staking Acc': a.stakingAccount ? shortAddress(a.stakingAccount) : 'NONE', })) diff --git a/cli/src/commands/working-groups/updateRoleAccount.ts b/cli/src/commands/working-groups/updateRoleAccount.ts index 1c11eed57a..f87b08c2a1 100644 --- a/cli/src/commands/working-groups/updateRoleAccount.ts +++ b/cli/src/commands/working-groups/updateRoleAccount.ts @@ -30,7 +30,7 @@ export default class WorkingGroupsUpdateRoleAccount extends WorkingGroupsCommand } await this.sendAndFollowNamedTx( - await this.getDecodedPair(worker.profile.membership.controller_account), + await this.getDecodedPair(worker.profile.membership.controllerAccount), apiModuleByGroup[this.group], 'updateRoleAccount', [worker.workerId, address] diff --git a/cli/src/commands/working-groups/updateRoleStorage.ts b/cli/src/commands/working-groups/updateRoleStorage.ts deleted file mode 100644 index cc3b5a1bcd..0000000000 --- a/cli/src/commands/working-groups/updateRoleStorage.ts +++ /dev/null @@ -1,33 +0,0 @@ -import WorkingGroupsCommandBase from '../../base/WorkingGroupsCommandBase' -import { apiModuleByGroup } from '../../Api' -import chalk from 'chalk' - -export default class WorkingGroupsUpdateRoleStorage extends WorkingGroupsCommandBase { - static description = 'Updates the associated worker storage' - static args = [ - { - name: 'storage', - required: true, - description: 'Worker storage', - }, - ] - - static flags = { - ...WorkingGroupsCommandBase.flags, - } - - async run(): Promise { - const { storage } = this.parse(WorkingGroupsUpdateRoleStorage).args - - const worker = await this.getRequiredWorkerContext() - - await this.sendAndFollowNamedTx( - await this.getDecodedPair(worker.roleAccount), - apiModuleByGroup[this.group], - 'updateRoleStorage', - [worker.workerId, storage] - ) - - this.log(chalk.green(`Successfully updated the associated worker storage to: ${chalk.magentaBright(storage)})`)) - } -} diff --git a/cli/src/graphql/generated/queries.ts b/cli/src/graphql/generated/queries.ts index 6aa6faed9b..d792bf8ebd 100644 --- a/cli/src/graphql/generated/queries.ts +++ b/cli/src/graphql/generated/queries.ts @@ -1,6 +1,14 @@ import * as Types from './schema' import gql from 'graphql-tag' +export type ChannelFieldsFragment = { id: string; videos: Array<{ id: string; videoStateBloatBond: any }> } + +export type GetChannelByIdQueryVariables = Types.Exact<{ + channelId: Types.Scalars['ID'] +}> + +export type GetChannelByIdQuery = { channelByUniqueInput?: Types.Maybe } + export type MemberMetadataFieldsFragment = { name?: Types.Maybe; about?: Types.Maybe } export type MembershipFieldsFragment = { id: string; handle: string; metadata: MemberMetadataFieldsFragment } @@ -13,6 +21,10 @@ export type GetMembersByIdsQuery = { memberships: Array }> } @@ -22,17 +34,39 @@ export type GetStorageNodesInfoByBagIdQueryVariables = Types.Exact<{ export type GetStorageNodesInfoByBagIdQuery = { storageBuckets: Array } +export type GetStorageBucketsQueryVariables = Types.Exact<{ + count?: Types.Maybe +}> + +export type GetStorageBucketsQuery = { storageBuckets: Array } + +export type StorageBucketsCountQueryVariables = Types.Exact<{ [key: string]: never }> + +export type StorageBucketsCountQuery = { storageBucketsConnection: { totalCount: number } } + +export type DistributionBucketFamilyFieldsFragment = { id: string; buckets: Array<{ id: string; bucketIndex: number }> } + +export type GetDistributionFamiliesAndBucketsQueryVariables = Types.Exact<{ [key: string]: never }> + +export type GetDistributionFamiliesAndBucketsQuery = { + distributionBucketFamilies: Array +} + export type DataObjectInfoFragment = { id: string size: any - deletionPrize: any + stateBloatBond: any type: | { __typename: 'DataObjectTypeChannelAvatar'; channel?: Types.Maybe<{ id: string }> } | { __typename: 'DataObjectTypeChannelCoverPhoto'; channel?: Types.Maybe<{ id: string }> } | { __typename: 'DataObjectTypeVideoMedia'; video?: Types.Maybe<{ id: string }> } | { __typename: 'DataObjectTypeVideoThumbnail'; video?: Types.Maybe<{ id: string }> } | { __typename: 'DataObjectTypePlaylistThumbnail'; playlist?: Types.Maybe<{ id: string }> } - | { __typename: 'DataObjectTypeVideoSubtitle' } + | { + __typename: 'DataObjectTypeVideoSubtitle' + video?: Types.Maybe<{ id: string }> + subtitle?: Types.Maybe<{ id: string }> + } | { __typename: 'DataObjectTypeUnknown' } } @@ -125,6 +159,15 @@ export type UpcomingWorkingGroupOpeningByIdQuery = { upcomingWorkingGroupOpeningByUniqueInput?: Types.Maybe } +export const ChannelFields = gql` + fragment ChannelFields on Channel { + id + videos { + id + videoStateBloatBond + } + } +` export const MemberMetadataFields = gql` fragment MemberMetadataFields on MemberMetadata { name @@ -144,16 +187,29 @@ export const MembershipFields = gql` export const StorageNodeInfo = gql` fragment StorageNodeInfo on StorageBucket { id + dataObjectsSize + dataObjectsSizeLimit + dataObjectsCount + dataObjectCountLimit operatorMetadata { nodeEndpoint } } ` +export const DistributionBucketFamilyFields = gql` + fragment DistributionBucketFamilyFields on DistributionBucketFamily { + id + buckets { + id + bucketIndex + } + } +` export const DataObjectInfo = gql` fragment DataObjectInfo on StorageDataObject { id size - deletionPrize + stateBloatBond type { __typename ... on DataObjectTypeVideoMedia { @@ -171,6 +227,14 @@ export const DataObjectInfo = gql` id } } + ... on DataObjectTypeVideoSubtitle { + video { + id + } + subtitle { + id + } + } ... on DataObjectTypeChannelAvatar { channel { id @@ -228,6 +292,14 @@ export const UpcomingWorkingGroupOpeningDetails = gql` } ${WorkingGroupOpeningMetadataFields} ` +export const GetChannelById = gql` + query getChannelById($channelId: ID!) { + channelByUniqueInput(where: { id: $channelId }) { + ...ChannelFields + } + } + ${ChannelFields} +` export const GetMembersByIds = gql` query getMembersByIds($ids: [ID!]) { memberships(where: { id_in: $ids }) { @@ -250,6 +322,29 @@ export const GetStorageNodesInfoByBagId = gql` } ${StorageNodeInfo} ` +export const GetStorageBuckets = gql` + query getStorageBuckets($count: Int) { + storageBuckets(where: { acceptingNewBags_eq: true }, limit: $count) { + ...StorageNodeInfo + } + } + ${StorageNodeInfo} +` +export const StorageBucketsCount = gql` + query storageBucketsCount { + storageBucketsConnection(where: { acceptingNewBags_eq: true }) { + totalCount + } + } +` +export const GetDistributionFamiliesAndBuckets = gql` + query getDistributionFamiliesAndBuckets { + distributionBucketFamilies { + ...DistributionBucketFamilyFields + } + } + ${DistributionBucketFamilyFields} +` export const GetDataObjectsByBagId = gql` query getDataObjectsByBagId($bagId: ID) { storageDataObjects(where: { storageBag: { id_eq: $bagId } }) { diff --git a/cli/src/graphql/generated/schema.ts b/cli/src/graphql/generated/schema.ts index 5d76feed19..9141131b6c 100644 --- a/cli/src/graphql/generated/schema.ts +++ b/cli/src/graphql/generated/schema.ts @@ -9,14 +9,14 @@ export type Scalars = { Boolean: boolean Int: number Float: number - /** The javascript `Date` as string. Type represents date and time as the ISO Date string. */ - DateTime: any /** GraphQL representation of BigInt */ BigInt: any - /** The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ - JSONObject: any /** GraphQL representation of Bytes */ Bytes: any + /** The javascript `Date` as string. Type represents date and time as the ISO Date string. */ + DateTime: any + /** The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ + JSONObject: any } export type AmendConstitutionProposalDetails = { @@ -26,6 +26,14 @@ export type AmendConstitutionProposalDetails = { export type AnnouncingPeriodStartedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -36,14 +44,6 @@ export type AnnouncingPeriodStartedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] } export type AnnouncingPeriodStartedEventConnection = { @@ -134,6 +134,7 @@ export type AnnouncingPeriodStartedEventWhereInput = { indexInBlock_in?: Maybe> AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AnnouncingPeriodStartedEventWhereUniqueInput = { @@ -143,11 +144,11 @@ export type AnnouncingPeriodStartedEventWhereUniqueInput = { export type ApplicationFormQuestion = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] openingMetadata: WorkingGroupOpeningMetadata openingMetadataId: Scalars['String'] @@ -163,11 +164,11 @@ export type ApplicationFormQuestion = BaseGraphQlObject & { export type ApplicationFormQuestionAnswer = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] application: WorkingGroupApplication applicationId: Scalars['String'] @@ -249,6 +250,7 @@ export type ApplicationFormQuestionAnswerWhereInput = { question?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type ApplicationFormQuestionAnswerWhereUniqueInput = { @@ -346,6 +348,7 @@ export type ApplicationFormQuestionWhereInput = { applicationformquestionanswerquestion_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type ApplicationFormQuestionWhereUniqueInput = { @@ -378,6 +381,14 @@ export type ApplicationStatusWithdrawn = { export type ApplicationWithdrawnEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -388,14 +399,6 @@ export type ApplicationWithdrawnEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] group: WorkingGroup groupId: Scalars['String'] application: WorkingGroupApplication @@ -500,6 +503,7 @@ export type ApplicationWithdrawnEventWhereInput = { application?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type ApplicationWithdrawnEventWhereUniqueInput = { @@ -508,6 +512,14 @@ export type ApplicationWithdrawnEventWhereUniqueInput = { export type AppliedOnOpeningEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -518,14 +530,6 @@ export type AppliedOnOpeningEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] group: WorkingGroup groupId: Scalars['String'] opening: WorkingGroupOpening @@ -637,6 +641,7 @@ export type AppliedOnOpeningEventWhereInput = { application?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AppliedOnOpeningEventWhereUniqueInput = { @@ -647,11 +652,11 @@ export type AppliedOnOpeningEventWhereUniqueInput = { export type Auction = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] nft: OwnedNft nftId: Scalars['String'] @@ -685,6 +690,14 @@ export type Auction = BaseGraphQlObject & { export type AuctionBidCanceledEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -695,14 +708,6 @@ export type AuctionBidCanceledEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] member: Membership memberId: Scalars['String'] video: Video @@ -821,6 +826,7 @@ export type AuctionBidCanceledEventWhereInput = { ownerCuratorGroup?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AuctionBidCanceledEventWhereUniqueInput = { @@ -829,6 +835,14 @@ export type AuctionBidCanceledEventWhereUniqueInput = { export type AuctionBidMadeEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -839,14 +853,6 @@ export type AuctionBidMadeEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] member: Membership memberId: Scalars['String'] video: Video @@ -991,6 +997,7 @@ export type AuctionBidMadeEventWhereInput = { previousTopBidder?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AuctionBidMadeEventWhereUniqueInput = { @@ -999,6 +1006,14 @@ export type AuctionBidMadeEventWhereUniqueInput = { export type AuctionCanceledEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -1009,14 +1024,6 @@ export type AuctionCanceledEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] /** Content actor canceling the event. */ contentActor: ContentActor video: Video @@ -1133,6 +1140,7 @@ export type AuctionCanceledEventWhereInput = { ownerCuratorGroup?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AuctionCanceledEventWhereUniqueInput = { @@ -1303,6 +1311,7 @@ export type AuctionWhereInput = { transactionalstatusupdatetransactionalStatusAuction_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type AuctionWhereUniqueInput = { @@ -1324,33 +1333,33 @@ export type AvatarUri = { export type BaseGraphQlObject = { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] } export type BaseModel = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] } export type BaseModelUuid = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] } @@ -1382,11 +1391,11 @@ export type BaseWhereInput = { export type Bid = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] auction: Auction auctionId: Scalars['String'] @@ -1433,6 +1442,14 @@ export type BidEdge = { export type BidMadeCompletingAuctionEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -1443,14 +1460,6 @@ export type BidMadeCompletingAuctionEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] member: Membership memberId: Scalars['String'] video: Video @@ -1606,6 +1615,7 @@ export type BidMadeCompletingAuctionEventWhereInput = { bidders_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BidMadeCompletingAuctionEventWhereUniqueInput = { @@ -1711,6 +1721,7 @@ export type BidWhereInput = { openauctionbidacceptedeventwinningBid_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BidWhereUniqueInput = { @@ -1720,11 +1731,11 @@ export type BidWhereUniqueInput = { export type Bounty = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] /** Bounty title */ title?: Maybe @@ -1770,6 +1781,14 @@ export type Bounty = BaseGraphQlObject & { export type BountyCanceledEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -1780,14 +1799,6 @@ export type BountyCanceledEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -1885,6 +1896,7 @@ export type BountyCanceledEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyCanceledEventWhereUniqueInput = { @@ -1900,11 +1912,11 @@ export type BountyConnection = { export type BountyContribution = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] @@ -2003,14 +2015,41 @@ export type BountyContributionWhereInput = { withdrawnInEvent?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyContributionWhereUniqueInput = { id: Scalars['ID'] } +export type BountyCreateInput = { + title?: Maybe + description?: Maybe + bannerImageUri?: Maybe + cherry: Scalars['String'] + entrantStake: Scalars['String'] + creator?: Maybe + oracle?: Maybe + fundingType: Scalars['JSONObject'] + entrantWhitelist?: Maybe + workPeriod: Scalars['Float'] + judgingPeriod: Scalars['Float'] + stage: BountyStage + totalFunding: Scalars['String'] + discussionThread?: Maybe + isTerminated: Scalars['Boolean'] +} + export type BountyCreatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2021,14 +2060,6 @@ export type BountyCreatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -2126,32 +2157,23 @@ export type BountyCreatedEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyCreatedEventWhereUniqueInput = { id: Scalars['ID'] } -export type BountyCreateInput = { - title?: Maybe - description?: Maybe - bannerImageUri?: Maybe - cherry: Scalars['String'] - entrantStake: Scalars['String'] - creator?: Maybe - oracle?: Maybe - fundingType: Scalars['JSONObject'] - entrantWhitelist?: Maybe - workPeriod: Scalars['Float'] - judgingPeriod: Scalars['Float'] - stage: BountyStage - totalFunding: Scalars['String'] - discussionThread?: Maybe - isTerminated: Scalars['Boolean'] -} - export type BountyCreatorCherryWithdrawalEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2162,14 +2184,6 @@ export type BountyCreatorCherryWithdrawalEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -2267,6 +2281,7 @@ export type BountyCreatorCherryWithdrawalEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyCreatorCherryWithdrawalEventWhereUniqueInput = { @@ -2281,11 +2296,11 @@ export type BountyEdge = { export type BountyEntrantWhitelist = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] phantom?: Maybe members: Array @@ -2361,6 +2376,7 @@ export type BountyEntrantWhitelistWhereInput = { bountyentrantWhitelist_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyEntrantWhitelistWhereUniqueInput = { @@ -2370,11 +2386,11 @@ export type BountyEntrantWhitelistWhereUniqueInput = { export type BountyEntry = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] @@ -2508,6 +2524,7 @@ export type BountyEntryWhereInput = { cashedOutInEvent?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyEntryWhereUniqueInput = { @@ -2516,6 +2533,14 @@ export type BountyEntryWhereUniqueInput = { export type BountyFundedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2526,14 +2551,6 @@ export type BountyFundedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] contribution: BountyContribution contributionId: Scalars['String'] } @@ -2631,6 +2648,7 @@ export type BountyFundedEventWhereInput = { contribution?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyFundedEventWhereUniqueInput = { @@ -2655,6 +2673,14 @@ export type BountyFundingType = BountyFundingPerpetual | BountyFundingLimited export type BountyFundingWithdrawalEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2665,14 +2691,6 @@ export type BountyFundingWithdrawalEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] contribution: BountyContribution contributionId: Scalars['String'] } @@ -2770,6 +2788,7 @@ export type BountyFundingWithdrawalEventWhereInput = { contribution?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyFundingWithdrawalEventWhereUniqueInput = { @@ -2778,6 +2797,14 @@ export type BountyFundingWithdrawalEventWhereUniqueInput = { export type BountyMaxFundingReachedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2788,14 +2815,6 @@ export type BountyMaxFundingReachedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -2893,6 +2912,7 @@ export type BountyMaxFundingReachedEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyMaxFundingReachedEventWhereUniqueInput = { @@ -2938,6 +2958,14 @@ export enum BountyOrderByInput { export type BountyRemovedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -2948,14 +2976,6 @@ export type BountyRemovedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -3053,6 +3073,7 @@ export type BountyRemovedEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyRemovedEventWhereUniqueInput = { @@ -3088,6 +3109,14 @@ export type BountyUpdateInput = { export type BountyVetoedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3098,14 +3127,6 @@ export type BountyVetoedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] bounty: Bounty bountyId: Scalars['String'] } @@ -3203,6 +3224,7 @@ export type BountyVetoedEventWhereInput = { bounty?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyVetoedEventWhereUniqueInput = { @@ -3308,6 +3330,7 @@ export type BountyWhereInput = { worksubmittedeventbounty_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BountyWhereUniqueInput = { @@ -3316,6 +3339,14 @@ export type BountyWhereUniqueInput = { export type BudgetBalanceSetEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3326,14 +3357,6 @@ export type BudgetBalanceSetEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] /** Budget balance that has been set. */ balance: Scalars['BigInt'] } @@ -3436,6 +3459,7 @@ export type BudgetBalanceSetEventWhereInput = { balance_in?: Maybe> AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetBalanceSetEventWhereUniqueInput = { @@ -3444,6 +3468,14 @@ export type BudgetBalanceSetEventWhereUniqueInput = { export type BudgetIncrementUpdatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3454,14 +3486,6 @@ export type BudgetIncrementUpdatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] /** Amount that is added to the budget each time it's refilled. */ amount: Scalars['BigInt'] } @@ -3564,6 +3588,7 @@ export type BudgetIncrementUpdatedEventWhereInput = { amount_in?: Maybe> AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetIncrementUpdatedEventWhereUniqueInput = { @@ -3572,6 +3597,14 @@ export type BudgetIncrementUpdatedEventWhereUniqueInput = { export type BudgetRefillEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3582,14 +3615,6 @@ export type BudgetRefillEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] /** Balance that has been refilled. */ balance: Scalars['BigInt'] } @@ -3692,6 +3717,7 @@ export type BudgetRefillEventWhereInput = { balance_in?: Maybe> AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetRefillEventWhereUniqueInput = { @@ -3700,6 +3726,14 @@ export type BudgetRefillEventWhereUniqueInput = { export type BudgetRefillPlannedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3710,14 +3744,6 @@ export type BudgetRefillPlannedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] nextRefillInBlock: Scalars['Int'] } @@ -3819,6 +3845,7 @@ export type BudgetRefillPlannedEventWhereInput = { nextRefillInBlock_in?: Maybe> AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetRefillPlannedEventWhereUniqueInput = { @@ -3827,6 +3854,14 @@ export type BudgetRefillPlannedEventWhereUniqueInput = { export type BudgetSetEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3837,14 +3872,6 @@ export type BudgetSetEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] group: WorkingGroup groupId: Scalars['String'] /** New working group budget */ @@ -3954,6 +3981,7 @@ export type BudgetSetEventWhereInput = { group?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetSetEventWhereUniqueInput = { @@ -3962,6 +3990,14 @@ export type BudgetSetEventWhereUniqueInput = { export type BudgetSpendingEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -3972,14 +4008,6 @@ export type BudgetSpendingEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] group: WorkingGroup groupId: Scalars['String'] /** Reciever account address */ @@ -4111,6 +4139,7 @@ export type BudgetSpendingEventWhereInput = { group?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetSpendingEventWhereUniqueInput = { @@ -4119,8 +4148,16 @@ export type BudgetSpendingEventWhereUniqueInput = { export type BudgetUpdatedEvent = Event & BaseGraphQlObject & { - /** Hash of the extrinsic which caused the event to be emitted */ - inExtrinsic?: Maybe + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] + /** Hash of the extrinsic which caused the event to be emitted */ + inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ inBlock: Scalars['Int'] /** Network the block was produced in */ @@ -4129,14 +4166,6 @@ export type BudgetUpdatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] group: WorkingGroup groupId: Scalars['String'] /** Amount substracted from / added to the current budget */ @@ -4246,6 +4275,7 @@ export type BudgetUpdatedEventWhereInput = { group?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BudgetUpdatedEventWhereUniqueInput = { @@ -4254,6 +4284,14 @@ export type BudgetUpdatedEventWhereUniqueInput = { export type BuyNowCanceledEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -4264,14 +4302,6 @@ export type BuyNowCanceledEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] video: Video videoId: Scalars['String'] /** Content actor acting as NFT owner. */ @@ -4388,6 +4418,7 @@ export type BuyNowCanceledEventWhereInput = { ownerCuratorGroup?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BuyNowCanceledEventWhereUniqueInput = { @@ -4396,6 +4427,14 @@ export type BuyNowCanceledEventWhereUniqueInput = { export type BuyNowPriceUpdatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted. */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -4406,14 +4445,6 @@ export type BuyNowPriceUpdatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] video: Video videoId: Scalars['String'] /** Content actor acting as NFT owner. */ @@ -4542,6 +4573,7 @@ export type BuyNowPriceUpdatedEventWhereInput = { ownerCuratorGroup?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type BuyNowPriceUpdatedEventWhereUniqueInput = { @@ -4556,11 +4588,11 @@ export type CancelWorkingGroupLeadOpeningProposalDetails = { export type CandidacyNoteMetadata = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] /** Candidacy header text. */ header?: Maybe @@ -4665,6 +4697,7 @@ export type CandidacyNoteMetadataWhereInput = { candidatenoteMetadata_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CandidacyNoteMetadataWhereUniqueInput = { @@ -4673,6 +4706,14 @@ export type CandidacyNoteMetadataWhereUniqueInput = { export type CandidacyNoteSetEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -4683,14 +4724,6 @@ export type CandidacyNoteSetEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] candidate: Candidate candidateId: Scalars['String'] noteMetadata: CandidacyNoteMetadata @@ -4795,6 +4828,7 @@ export type CandidacyNoteSetEventWhereInput = { noteMetadata?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CandidacyNoteSetEventWhereUniqueInput = { @@ -4803,6 +4837,14 @@ export type CandidacyNoteSetEventWhereUniqueInput = { export type CandidacyStakeReleaseEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -4813,14 +4855,6 @@ export type CandidacyStakeReleaseEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] candidate: Candidate candidateId: Scalars['String'] } @@ -4918,6 +4952,7 @@ export type CandidacyStakeReleaseEventWhereInput = { candidate?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CandidacyStakeReleaseEventWhereUniqueInput = { @@ -4933,6 +4968,14 @@ export enum CandidacyStatus { export type CandidacyWithdrawEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -4943,14 +4986,6 @@ export type CandidacyWithdrawEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] candidate: Candidate candidateId: Scalars['String'] } @@ -5048,6 +5083,7 @@ export type CandidacyWithdrawEventWhereInput = { candidate?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CandidacyWithdrawEventWhereUniqueInput = { @@ -5057,11 +5093,11 @@ export type CandidacyWithdrawEventWhereUniqueInput = { export type Candidate = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] /** Account used for staking currency needed for the candidacy. */ stakingAccountId: Scalars['String'] @@ -5245,6 +5281,7 @@ export type CandidateWhereInput = { newcandidateeventcandidate_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CandidateWhereUniqueInput = { @@ -5254,11 +5291,11 @@ export type CandidateWhereUniqueInput = { export type CastVote = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] /** Hashed vote that was casted before being revealed. Hex format. */ commitment: Scalars['String'] @@ -5391,6 +5428,7 @@ export type CastVoteWhereInput = { voterevealedeventcastVote_every?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CastVoteWhereUniqueInput = { @@ -5399,6 +5437,14 @@ export type CastVoteWhereUniqueInput = { export type CategoryArchivalStatusUpdatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -5409,14 +5455,6 @@ export type CategoryArchivalStatusUpdatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] category: ForumCategory categoryId: Scalars['String'] /** The new archival status of the category (true = archived) */ @@ -5529,6 +5567,7 @@ export type CategoryArchivalStatusUpdatedEventWhereInput = { actor?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CategoryArchivalStatusUpdatedEventWhereUniqueInput = { @@ -5537,6 +5576,14 @@ export type CategoryArchivalStatusUpdatedEventWhereUniqueInput = { export type CategoryCreatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -5547,14 +5594,6 @@ export type CategoryCreatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] category: ForumCategory categoryId: Scalars['String'] } @@ -5652,6 +5691,7 @@ export type CategoryCreatedEventWhereInput = { category?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CategoryCreatedEventWhereUniqueInput = { @@ -5660,6 +5700,14 @@ export type CategoryCreatedEventWhereUniqueInput = { export type CategoryDeletedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -5670,14 +5718,6 @@ export type CategoryDeletedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] category: ForumCategory categoryId: Scalars['String'] actor: Worker @@ -5782,6 +5822,7 @@ export type CategoryDeletedEventWhereInput = { actor?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CategoryDeletedEventWhereUniqueInput = { @@ -5790,6 +5831,14 @@ export type CategoryDeletedEventWhereUniqueInput = { export type CategoryMembershipOfModeratorUpdatedEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -5800,14 +5849,6 @@ export type CategoryMembershipOfModeratorUpdatedEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] moderator: Worker moderatorId: Scalars['String'] category: ForumCategory @@ -5920,6 +5961,7 @@ export type CategoryMembershipOfModeratorUpdatedEventWhereInput = { category?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CategoryMembershipOfModeratorUpdatedEventWhereUniqueInput = { @@ -5944,6 +5986,14 @@ export type CategoryStatusRemoved = { export type CategoryStickyThreadUpdateEvent = Event & BaseGraphQlObject & { + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + createdById: Scalars['ID'] + updatedAt?: Maybe + updatedById?: Maybe + deletedAt?: Maybe + deletedById?: Maybe + version: Scalars['Int'] /** Hash of the extrinsic which caused the event to be emitted */ inExtrinsic?: Maybe /** Blocknumber of the block in which the event was emitted. */ @@ -5954,14 +6004,6 @@ export type CategoryStickyThreadUpdateEvent = Event & indexInBlock: Scalars['Int'] /** Filtering options for interface implementers */ type?: Maybe - id: Scalars['ID'] - createdAt: Scalars['DateTime'] - createdById: Scalars['String'] - updatedAt?: Maybe - updatedById?: Maybe - deletedAt?: Maybe - deletedById?: Maybe - version: Scalars['Int'] category: ForumCategory categoryId: Scalars['String'] newStickyThreads: Array @@ -6070,6 +6112,7 @@ export type CategoryStickyThreadUpdateEventWhereInput = { actor?: Maybe AND?: Maybe> OR?: Maybe> + NOT?: Maybe> } export type CategoryStickyThreadUpdateEventWhereUniqueInput = { @@ -6079,20 +6122,16 @@ export type CategoryStickyThreadUpdateEventWhereUniqueInput = { export type Channel = BaseGraphQlObject & { id: Scalars['ID'] createdAt: Scalars['DateTime'] - createdById: Scalars['String'] + createdById: Scalars['ID'] updatedAt?: Maybe - updatedById?: Maybe + updatedById?: Maybe deletedAt?: Maybe - deletedById?: Maybe + deletedById?: Maybe version: Scalars['Int'] ownerMember?: Maybe ownerMemberId?: Maybe ownerCuratorGroup?: Maybe ownerCuratorGroupId?: Maybe - category?: Maybe - categoryId?: Maybe - /** Reward account where revenue is sent if set. */ - rewardAccount?: Maybe /** The title of the Channel */ title?: Maybe /** The description of a Channel */ @@ -6112,78 +6151,109 @@ export type Channel = BaseGraphQlObject & { videos: Array - -### ChannelCategoryMetadata - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Category Name | - - - - - - ### ChannelMetadata @@ -158,7 +162,6 @@ | language | [string](#string) | optional | ISO_639-1 Language [Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) | | cover_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) | | avatar_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) | -| category | [uint64](#uint64) | optional | Channel Category Id | @@ -231,26 +234,67 @@ - + -### ForumPostReaction -The enum must be wrapped inside "message", otherwide it breaks protobufjs +### ForumThreadMetadata +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| title | [string](#string) | optional | Thread title | +| tags | [string](#string) | repeated | Tags accociated with the thread. Any update overrides all current tags. Only the first {MAX_TAGS_PER_FORUM_THREAD} (const exposed via @joystream/metadata-protobuf/consts) tags are taken into account. In order to unset current tags, [''] (array with empty string) must be provided as value. | - -### ForumThreadMetadata + + + + + + + + + + + + +

Top

+ +## proto/Membership.proto + + + + + +### MembershipMetadata | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| title | [string](#string) | optional | Thread title | -| tags | [string](#string) | repeated | Tags accociated with the thread. Any update overrides all current tags. Only the first {MAX_TAGS_PER_FORUM_THREAD} (const exposed via @joystream/metadata-protobuf/consts) tags are taken into account. In order to unset current tags, [''] (array with empty string) must be provided as value. | +| name | [string](#string) | optional | Member's real name | +| avatar_object | [uint32](#uint32) | optional | Member's avatar - index into external [assets array](#.Assets) | +| avatar_uri | [string](#string) | optional | Url to member's avatar | +| about | [string](#string) | optional | Member's md-formatted about text | +| externalResources | [MembershipMetadata.ExternalResource](#MembershipMetadata.ExternalResource) | repeated | | + + + + + + + + +### MembershipMetadata.ExternalResource + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [MembershipMetadata.ExternalResource.ResourceType](#MembershipMetadata.ExternalResource.ResourceType) | optional | | +| value | [string](#string) | optional | | @@ -259,15 +303,24 @@ The enum must be wrapped inside "message", otherwide it breaks protobufj - + -### ForumPostReaction.Reaction +### MembershipMetadata.ExternalResource.ResourceType | Name | Number | Description | | ---- | ------ | ----------- | -| CANCEL | 0 | This means cancelling any previous reaction | -| LIKE | 1 | | +| EMAIL | 0 | | +| HYPERLINK | 1 | | +| TWITTER | 2 | | +| TELEGRAM | 3 | | +| DISCORD | 4 | | +| FACEBOOK | 5 | | +| YOUTUBE | 6 | | +| MATRIX | 7 | | +| IRC | 8 | | +| WECHAT | 9 | | +| WHATSAPP | 10 | | @@ -278,25 +331,222 @@ The enum must be wrapped inside "message", otherwide it breaks protobufj - +

Top

-## proto/Membership.proto +## proto/Metaprotocol.proto - + -### MembershipMetadata +### BanOrUnbanMemberFromChannel | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Member's real name | -| avatar_object | [uint32](#uint32) | optional | Member's avatar - index into external [assets array](#.Assets) | -| avatar_uri | [string](#string) | optional | Url to member's avatar | -| about | [string](#string) | optional | Member's md-formatted about text | +| member_id | [uint64](#uint64) | required | ID of the member that channel owner wants to ban from participating on any video. | +| option | [BanOrUnbanMemberFromChannel.Option](#BanOrUnbanMemberFromChannel.Option) | required | Selected option to ban or unban member from the channel | + + + + + + + + +### ChannelModeratorRemarked + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| moderate_comment | [ModerateComment](#ModerateComment) | optional | | + + + + + + + + +### ChannelOwnerRemarked + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| pin_or_unpin_comment | [PinOrUnpinComment](#PinOrUnpinComment) | optional | | +| ban_or_unban_member_from_channel | [BanOrUnbanMemberFromChannel](#BanOrUnbanMemberFromChannel) | optional | | +| video_reactions_preference | [VideoReactionsPreference](#VideoReactionsPreference) | optional | | +| moderate_comment | [ModerateComment](#ModerateComment) | optional | | + + + + + + + + +### CreateComment +create comment + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| video_id | [uint64](#uint64) | required | ID of the video | +| parent_comment_id | [string](#string) | optional | ID of comment member wants to reply (empty if new comment is parent comment) | +| body | [string](#string) | required | Comment text | + + + + + + + + +### CreateVideoCategory + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | required | | +| description | [string](#string) | optional | | +| parent_category_id | [string](#string) | optional | | + + + + + + + + +### DeleteComment +delete comment by author + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| comment_id | [string](#string) | required | ID of the comment which will be deleted | + + + + + + + + +### EditComment +edit comment by author + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| comment_id | [string](#string) | required | ID of the comment whose text is being edited | +| new_body | [string](#string) | required | New comment body | + + + + + + + + +### MemberRemarked + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| react_video | [ReactVideo](#ReactVideo) | optional | | +| react_comment | [ReactComment](#ReactComment) | optional | | +| create_comment | [CreateComment](#CreateComment) | optional | | +| edit_comment | [EditComment](#EditComment) | optional | | +| delete_comment | [DeleteComment](#DeleteComment) | optional | | +| create_video_category | [CreateVideoCategory](#CreateVideoCategory) | optional | | + + + + + + + + +### ModerateComment +delete comment by moderator or channel owner; + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| comment_id | [string](#string) | required | ID of comment that will be deleted by moderator | +| rationale | [string](#string) | required | why moderator wants to delete this comment | + + + + + + + + +### PinOrUnpinComment +pin comment on a video by channel owner + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| video_id | [uint64](#uint64) | required | ID of the video | +| comment_id | [string](#string) | required | ID of the comment which will be pinned | +| option | [PinOrUnpinComment.Option](#PinOrUnpinComment.Option) | required | Selected option to pin or unpin comment from channel | + + + + + + + + +### ReactComment +reacting, unreacting to a comment + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| comment_id | [string](#string) | required | ID of the comment to react | +| reaction_id | [uint32](#uint32) | required | ID of the selected reaction | + + + + + + + + +### ReactVideo +reacting, unreacting, and changing reaction to video + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| video_id | [uint64](#uint64) | required | ID of the video to react | +| reaction | [ReactVideo.Reaction](#ReactVideo.Reaction) | required | Selected reaction | + + + + + + + + +### VideoReactionsPreference +Enable or disable reactions on a single video + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| video_id | [uint64](#uint64) | required | ID of the video | +| option | [VideoReactionsPreference.Option](#VideoReactionsPreference.Option) | required | Selected option to enable or disable comment section | @@ -304,6 +554,55 @@ The enum must be wrapped inside "message", otherwide it breaks protobufj + + + +### BanOrUnbanMemberFromChannel.Option + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| BAN | 0 | Ban member (nothing happens if member is already banned) | +| UNBAN | 1 | Unban member (nothing happens if member is already unbanned) | + + + + + +### PinOrUnpinComment.Option + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| PIN | 0 | Pin comment on video (nothing happens if comment is already pinned) | +| UNPIN | 1 | Unpin comment from video (nothing happens if comment is already unpinned) | + + + + + +### ReactVideo.Reaction +The enum must be wrapped inside "message", otherwide it breaks protobufjs +Reacting again with the same message option will cancel the previous reaction + +| Name | Number | Description | +| ---- | ------ | ----------- | +| LIKE | 0 | | +| UNLIKE | 1 | | + + + + + +### VideoReactionsPreference.Option + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| ENABLE | 0 | Enable reactions (nothing happens if they are already enabled) | +| DISABLE | 1 | Disable reactions (nothing happens if they are already disabled) | + + @@ -617,8 +916,8 @@ The enum must be wrapped inside "message", otherwide it breaks protobufj | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| video_metadata | [VideoMetadata](#VideoMetadata) | optional | For backward compatibility reasons, apps that deserialize metadata (e.g. Query Node) need to handle the deserialization of `VideoMetadata` message both as independent message and as a variant of `ContentMetadata`. Though, apps that serialize protobuf messages (mostly frontend apps) are advised to use `ContentMetadata` message for all new videos & playlists | -| playlist_metadata | [PlaylistMetadata](#PlaylistMetadata) | optional | | +| video_metadata | [VideoMetadata](#VideoMetadata) | optional | | +| playlist_metadata | [PlaylistMetadata](#PlaylistMetadata) | optional | ... Other possible metadata standards, e.g. `ArticleMetadata` | @@ -675,15 +974,18 @@ Publication status before joystream - + -### VideoCategoryMetadata +### SubtitleMetadata | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Category name | +| type | [string](#string) | required | | +| new_asset | [uint32](#uint32) | optional | index into external [assets array](#.Assets) | +| language | [string](#string) | required | ISO_639-1 Language [Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) | +| mimeType | [string](#string) | required | | @@ -713,7 +1015,10 @@ Publication status before joystream | is_public | [bool](#bool) | optional | Should video be publicy visible yet | | is_explicit | [bool](#bool) | optional | Does Video have explicit language or scenes | | persons | [uint64](#uint64) | repeated | Person(s) referenced by PersonId involved in this video | -| category | [uint64](#uint64) | optional | Video Category Id | +| category | [string](#string) | optional | Video Category Id | +| subtitles | [SubtitleMetadata](#SubtitleMetadata) | repeated | Video subtitles | +| enable_comments | [bool](#bool) | optional | Enable/Disable the comment section | +| clear_subtitles | [bool](#bool) | optional | Remove all subtitles; since protobuf doesn't distinguish b/w empty array and null field, simply removing all subtitles by overriding list with an empty array wont work | diff --git a/metadata-protobuf/package.json b/metadata-protobuf/package.json index fbb02e8568..919320f04d 100644 --- a/metadata-protobuf/package.json +++ b/metadata-protobuf/package.json @@ -1,7 +1,7 @@ { "name": "@joystream/metadata-protobuf", - "version": "2.1.0", - "description": "Joystream Metadata Protobuf Library (Olympia Release)", + "version": "2.5.0", + "description": "Joystream Metadata Protobuf Library", "main": "lib/index.js", "types": "lib/index.d.ts", "exports": { diff --git a/metadata-protobuf/proto/Channel.proto b/metadata-protobuf/proto/Channel.proto index e3afa78a30..57159b98fb 100644 --- a/metadata-protobuf/proto/Channel.proto +++ b/metadata-protobuf/proto/Channel.proto @@ -17,12 +17,4 @@ message ChannelMetadata { optional uint32 cover_photo = 5; // index into external [assets array](#.Assets) optional uint32 avatar_photo = 6; - - // Channel Category Id - optional uint64 category = 7; -} - -message ChannelCategoryMetadata { - // Category Name - optional string name = 1; } diff --git a/metadata-protobuf/proto/Forum.proto b/metadata-protobuf/proto/Forum.proto index 2f583550b6..ad728f9472 100644 --- a/metadata-protobuf/proto/Forum.proto +++ b/metadata-protobuf/proto/Forum.proto @@ -1,13 +1,5 @@ syntax = "proto2"; -// The enum must be wrapped inside "message", otherwide it breaks protobufjs -message ForumPostReaction { - enum Reaction { - CANCEL = 0; // This means cancelling any previous reaction - LIKE = 1; - } -} - message ForumPostMetadata { optional string text = 1; // Post text content (md-formatted) optional uint32 repliesTo = 2; // Id of the post that given post replies to (if any) diff --git a/metadata-protobuf/proto/Membership.proto b/metadata-protobuf/proto/Membership.proto index 9315758d1b..f12644d1bb 100644 --- a/metadata-protobuf/proto/Membership.proto +++ b/metadata-protobuf/proto/Membership.proto @@ -7,4 +7,23 @@ message MembershipMetadata { string avatar_uri = 4; // Url to member's avatar } optional string about = 3; // Member's md-formatted about text + + message ExternalResource { + enum ResourceType { + EMAIL = 0; + HYPERLINK = 1; + TWITTER = 2; + TELEGRAM = 3; + DISCORD = 4; + FACEBOOK = 5; + YOUTUBE = 6; + MATRIX = 7; + IRC = 8; + WECHAT = 9; + WHATSAPP = 10; + } + optional ResourceType type = 1; + optional string value = 2; + } + repeated ExternalResource externalResources = 5; } diff --git a/metadata-protobuf/proto/Metaprotocol.proto b/metadata-protobuf/proto/Metaprotocol.proto new file mode 100644 index 0000000000..b79e964488 --- /dev/null +++ b/metadata-protobuf/proto/Metaprotocol.proto @@ -0,0 +1,146 @@ +syntax = "proto2"; + +// reacting, unreacting, and changing reaction to video +message ReactVideo { + // ID of the video to react + required uint64 video_id = 1; + + // The enum must be wrapped inside "message", otherwide it breaks protobufjs + // Reacting again with the same message option will cancel the previous reaction + enum Reaction { + LIKE = 0; + UNLIKE = 1; + } + + // Selected reaction + required Reaction reaction = 2; +} + +// reacting, unreacting to a comment +message ReactComment { + // ID of the comment to react + required string comment_id = 1; + + // ID of the selected reaction + required uint32 reaction_id = 2; +} + +// create comment +message CreateComment { + // ID of the video + required uint64 video_id = 1; + + // ID of comment member wants to reply (empty if new comment is parent comment) + optional string parent_comment_id = 2; + + // Comment text + required string body = 3; +} + +// edit comment by author +message EditComment { + // ID of the comment whose text is being edited + required string comment_id = 1; + + // New comment body + required string new_body = 2; +} + +// delete comment by author +message DeleteComment { + // ID of the comment which will be deleted + required string comment_id = 1; +} + +// pin comment on a video by channel owner +message PinOrUnpinComment { + // ID of the video + required uint64 video_id = 1; + + // ID of the comment which will be pinned + required string comment_id = 2; + + enum Option { + PIN = 0; // Pin comment on video (nothing happens if comment is already pinned) + UNPIN = 1; // Unpin comment from video (nothing happens if comment is already unpinned) + } + + // Selected option to pin or unpin comment from channel + required Option option = 3; +} + + +// delete comment by moderator or channel owner; +message ModerateComment { + // ID of comment that will be deleted by moderator + required string comment_id = 1; + + // why moderator wants to delete this comment + required string rationale = 2; +} + +message BanOrUnbanMemberFromChannel { + // ID of the member that channel owner wants to ban from participating on any video. + required uint64 member_id = 1; + + enum Option { + BAN = 0; // Ban member (nothing happens if member is already banned) + UNBAN = 1; // Unban member (nothing happens if member is already unbanned) + } + + // Selected option to ban or unban member from the channel + required Option option = 2; +} + +// Enable or disable reactions on a single video +message VideoReactionsPreference { + // ID of the video + required uint64 video_id = 1; + + + enum Option { + ENABLE = 0; // Enable reactions (nothing happens if they are already enabled) + DISABLE = 1; // Disable reactions (nothing happens if they are already disabled) + } + + // Selected option to enable or disable comment section + required Option option = 2; +} + +message CreateVideoCategory { + required string name = 1; + optional string description = 2; + optional string parent_category_id = 3; +} + +message MemberRemarked { + // member_remark extrinsic would emit event containing + // any one of the following serialized messages + oneof member_remarked { + ReactVideo react_video = 1; + ReactComment react_comment = 2; + CreateComment create_comment = 3; + EditComment edit_comment = 4; + DeleteComment delete_comment = 5; + CreateVideoCategory create_video_category = 6; + } +} + +message ChannelModeratorRemarked { + // channel_moderator_remark extrinsic would emit event containing + // any one of the following serialized messages + oneof channel_moderator_remarked { + ModerateComment moderate_comment = 1; + } +} + +message ChannelOwnerRemarked { + // channel_owner_remark extrinsic would emit event containing + // any one of the following serialized messages + oneof channel_owner_remarked { + PinOrUnpinComment pin_or_unpin_comment = 1; + BanOrUnbanMemberFromChannel ban_or_unban_member_from_channel = 2; + VideoReactionsPreference video_reactions_preference = 3; + ModerateComment moderate_comment = 5; + } +} diff --git a/metadata-protobuf/proto/Video.proto b/metadata-protobuf/proto/Video.proto index ccf4974d52..9cf0282ba8 100644 --- a/metadata-protobuf/proto/Video.proto +++ b/metadata-protobuf/proto/Video.proto @@ -32,6 +32,18 @@ message MediaType { optional string mime_media_type = 3; } +message SubtitleMetadata { + required string type = 1; + + // index into external [assets array](#.Assets) + optional uint32 new_asset = 2; + + // ISO_639-1 Language [Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) + required string language = 3; + + required string mimeType = 4; +} + message VideoMetadata { // Video Title optional string title = 1; @@ -40,7 +52,7 @@ message VideoMetadata { optional string description = 2; // Assets - + // index into external [assets array](#.Assets) optional uint32 video = 3; @@ -52,7 +64,7 @@ message VideoMetadata { // Resolution of the video (Height) optional uint32 media_pixel_height = 6; - + // Resolution of the video (Width) optional uint32 media_pixel_width = 7; @@ -81,22 +93,26 @@ message VideoMetadata { repeated uint64 persons = 15 [packed=true]; // Video Category Id - optional uint64 category = 16; -} + optional string category = 16; + + // Video subtitles + repeated SubtitleMetadata subtitles = 17; + + // Enable/Disable the comment section + optional bool enable_comments = 18; + + // Remove all subtitles; since protobuf doesn't distinguish b/w + // empty array and null field, simply removing all subtitles by + // overriding list with an empty array wont work + optional bool clear_subtitles = 19; -message VideoCategoryMetadata { - // Category name - optional string name = 1; } message ContentMetadata { oneof content_metadata { - // For backward compatibility reasons, apps that deserialize metadata (e.g. Query Node) - // need to handle the deserialization of `VideoMetadata` message both as independent - // message and as a variant of `ContentMetadata`. Though, apps that serialize protobuf - // messages (mostly frontend apps) are advised to use `ContentMetadata` message for all - // new videos & playlists VideoMetadata video_metadata = 1; PlaylistMetadata playlist_metadata = 2; + // ... + // Other possible metadata standards, e.g. `ArticleMetadata` } -} \ No newline at end of file +} diff --git a/metadata-protobuf/test/channel.ts b/metadata-protobuf/test/channel.ts index f5077b6cbc..95f53247d3 100644 --- a/metadata-protobuf/test/channel.ts +++ b/metadata-protobuf/test/channel.ts @@ -12,20 +12,10 @@ describe('Channel Metadata', () => { language: 'fr', avatarPhoto: 0, coverPhoto: 1, - category: Long.fromNumber(100, true), } const channelMessage = new ChannelMetadata(channel) - assert.deepEqual(metaToObject(ChannelMetadata, channelMessage), { ...channel, category: '100' }) - assert.deepEqual(encodeDecode(ChannelMetadata, channel), { ...channel, category: '100' }) - }) - - it('Channel Metadata: Category as number', () => { - const channel = { category: 100 as any } - const channelMessage = new ChannelMetadata(channel) - ChannelMetadata.verify(channelMessage) - - assert.deepEqual(metaToObject(ChannelMetadata, channelMessage), { ...channel, category: '100' }) - assert.deepEqual(encodeDecode(ChannelMetadata, channel), { ...channel, category: '100' }) + assert.deepEqual(metaToObject(ChannelMetadata, channelMessage), channel) + assert.deepEqual(encodeDecode(ChannelMetadata, channel), channel) }) }) diff --git a/metadata-protobuf/test/video.ts b/metadata-protobuf/test/video.ts index e84a98377b..3769555a01 100644 --- a/metadata-protobuf/test/video.ts +++ b/metadata-protobuf/test/video.ts @@ -20,7 +20,7 @@ describe('Video Metadata', () => { isExplicit: false, video: 0, thumbnailPhoto: 1, - category: Long.fromNumber(101, true), + category: '101', } const videoMessage = new VideoMetadata(video) diff --git a/node/Cargo.toml b/node/Cargo.toml deleted file mode 100644 index ed47a5c92d..0000000000 --- a/node/Cargo.toml +++ /dev/null @@ -1,113 +0,0 @@ -[package] -authors = ['Joystream contributors'] -build = 'build.rs' -edition = '2018' -name = 'joystream-node' -version = '6.6.0' -default-run = "joystream-node" - -[[bin]] -name = 'joystream-node' -path = 'bin/main.rs' - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -# third-party dependencies -serde = { version = "1.0.102", features = ["derive"] } -futures = { version = "0.3.1", features = ["compat"] } -jsonrpc-core = "15.0.0" -structopt = { version = "0.3.8", optional = true} -serde_json = '1.0' -codec = { package = "parity-scale-codec", version = "1.3.4" } -hex = { package = "hex", version = "0.4.2" } - -# primitives -sp-authority-discovery = { package = 'sp-authority-discovery', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-consensus-babe = { package = 'sp-consensus-babe', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-finality-grandpa = { package = 'sp-finality-grandpa', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-core = { package = 'sp-core', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-runtime = { package = 'sp-runtime', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-finality-tracker = { package = 'sp-finality-tracker', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-inherents = { package = 'sp-inherents', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-consensus = { package = 'sp-consensus', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-transaction-pool = { package = 'sp-transaction-pool', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-api = { package = 'sp-api', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-blockchain = { package = 'sp-blockchain', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-block-builder = { package = 'sp-block-builder', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } - -# client dependencies -sc-client-api = { package = 'sc-client-api', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-chain-spec = { package = 'sc-chain-spec', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-consensus = { package = 'sc-consensus', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-transaction-pool = { package = 'sc-transaction-pool', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-network = { package = 'sc-network', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-consensus-babe = { package = 'sc-consensus-babe', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62'} -sc-finality-grandpa = { package = 'sc-finality-grandpa', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-basic-authorship = { package = 'sc-basic-authorship', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-service = { package = 'sc-service', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-authority-discovery = { package = 'sc-authority-discovery', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-consensus-epochs = { package = 'sc-consensus-epochs', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-keystore = { package = 'sc-keystore', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-consensus-babe-rpc = { package = 'sc-consensus-babe-rpc', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-finality-grandpa-rpc = { package = 'sc-finality-grandpa-rpc', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-rpc-api = { package = 'sc-rpc-api', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-rpc = { package = 'sc-rpc', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-executor = { package = 'sc-executor', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } - -# frame dependencies -pallet-im-online = { package = 'pallet-im-online', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -pallet-transaction-payment-rpc = { package = 'pallet-transaction-payment-rpc', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -substrate-frame-rpc-system = { package = 'substrate-frame-rpc-system', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -frame-benchmarking = { package = 'frame-benchmarking', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } - -# node-specific dependencies -node-runtime = { package= "joystream-node-runtime", path = "../runtime" } - -# CLI-specific dependencies -sc-cli = { package = 'sc-cli', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true } -frame-benchmarking-cli = { package = 'frame-benchmarking-cli', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true } -node-inspect = { package = 'node-inspect', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true } - -# WASM-specific dependencies -wasm-bindgen = { version = "0.2.57", optional = true } -wasm-bindgen-futures = { version = "0.4.7", optional = true } -browser-utils = { package = 'substrate-browser-utils', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true} - -[dev-dependencies] -tempfile = "3.1.0" -sp-timestamp = { package = 'sp-timestamp', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sp-keyring = { package = 'sp-keyring', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -sc-consensus-babe = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', features = ["test-helpers"]} -sc-service-test = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -frame-system = { package = 'frame-system', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -pallet-transaction-payment = { package = 'pallet-transaction-payment', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } -pallet-grandpa = { package = 'pallet-grandpa', git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62' } - -[build-dependencies] -structopt = { version = "0.3.8", optional = true } -node-inspect = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true} -sc-cli = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true} -frame-benchmarking-cli = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true } -substrate-build-script-utils = { git = 'https://github.com/paritytech/substrate.git', rev = '2cd20966cc09b059817c3ebe12fc130cdd850d62', optional = true } - -[features] -default = [ "cli" ] -browser = [ - "browser-utils", - "wasm-bindgen", - "wasm-bindgen-futures", -] -cli = [ - "node-inspect", - "sc-cli", - "frame-benchmarking-cli", - "sc-service/db", - "structopt", - "substrate-build-script-utils", -] -runtime-benchmarks = [ - "node-runtime/runtime-benchmarks", - "frame-benchmarking-cli", -] diff --git a/node/src/chain_spec/content_config.rs b/node/src/chain_spec/content_config.rs deleted file mode 100644 index 1346c6bba8..0000000000 --- a/node/src/chain_spec/content_config.rs +++ /dev/null @@ -1,61 +0,0 @@ -use node_runtime::{ - constants::{DAYS, HOURS, MINUTES}, - ContentConfig, -}; -use sp_runtime::Perbill; - -pub fn production_config() -> ContentConfig { - ContentConfig { - next_curator_group_id: 1, - next_channel_category_id: 1, - next_channel_id: 1, - next_video_category_id: 1, - next_video_id: 1, - next_video_post_id: 1, - max_reward_allowed: 1000, - min_cashout_allowed: 1, - min_auction_duration: MINUTES * 30, - max_auction_duration: DAYS * 90, - min_auction_extension_period: 0, - max_auction_extension_period: HOURS * 6, - min_bid_lock_duration: MINUTES * 1, - max_bid_lock_duration: HOURS * 24, - min_starting_price: 1, - max_starting_price: 1_000_000_000_000, - min_creator_royalty: Perbill::from_percent(1), - max_creator_royalty: Perbill::from_percent(50), - min_bid_step: 1, - max_bid_step: 1_000_000_000_000, - platform_fee_percentage: Perbill::from_percent(1), - auction_starts_at_max_delta: DAYS * 30, - max_auction_whitelist_length: 100, - } -} - -pub fn testing_config() -> ContentConfig { - ContentConfig { - next_curator_group_id: 1, - next_channel_category_id: 1, - next_channel_id: 1, - next_video_category_id: 1, - next_video_id: 1, - next_video_post_id: 1, - max_reward_allowed: 1000, - min_cashout_allowed: 1, - min_auction_duration: MINUTES / 2, - max_auction_duration: DAYS * 90, - min_auction_extension_period: 0, - max_auction_extension_period: HOURS * 6, - min_bid_lock_duration: MINUTES / 2, - max_bid_lock_duration: HOURS * 24, - min_starting_price: 1, - max_starting_price: 1_000_000_000, - min_creator_royalty: Perbill::from_percent(1), - max_creator_royalty: Perbill::from_percent(50), - min_bid_step: 1, - max_bid_step: 1_000_000, - platform_fee_percentage: Perbill::from_percent(1), - auction_starts_at_max_delta: DAYS * 30, - max_auction_whitelist_length: 100, - } -} diff --git a/node/src/chain_spec/council_config.rs b/node/src/chain_spec/council_config.rs deleted file mode 100644 index c219deae17..0000000000 --- a/node/src/chain_spec/council_config.rs +++ /dev/null @@ -1,24 +0,0 @@ -use node_runtime::council::{CouncilStageUpdate, Trait as CouncilTrait}; -use node_runtime::referendum::ReferendumStage; -use node_runtime::{CouncilConfig, ReferendumConfig, Runtime}; - -pub fn create_council_config() -> CouncilConfig { - CouncilConfig { - stage: CouncilStageUpdate::default(), - council_members: vec![], - candidates: vec![], - announcement_period_nr: 0, - budget: 0, - next_reward_payments: 0, - next_budget_refill: ::BudgetRefillPeriod::get(), - budget_increment: 1, - councilor_reward: 100, - } -} - -pub fn create_referendum_config() -> ReferendumConfig { - ReferendumConfig { - stage: ReferendumStage::default(), - votes: vec![], - } -} diff --git a/node/src/chain_spec/forum_config.rs b/node/src/chain_spec/forum_config.rs deleted file mode 100644 index 407ae572b8..0000000000 --- a/node/src/chain_spec/forum_config.rs +++ /dev/null @@ -1,150 +0,0 @@ -use codec::Decode; -use node_runtime::{ - forum, - forum::{Category, Post, Thread}, - AccountId, Balance, BlockNumber, ForumConfig, Moment, PostId, Runtime, ThreadId, -}; -use serde::Deserialize; -use sp_core::H256; -use std::{fs, path::Path}; - -type CategoryId = ::CategoryId; -type ForumUserId = forum::ForumUserId; -type ModeratorId = forum::ModeratorId; -type Hash = H256; -type PostOf = Post; - -type ThreadOf = ( - CategoryId, - ThreadId, - Thread, -); - -#[derive(Decode)] -struct ForumData { - categories: Vec<(CategoryId, Category)>, - posts: Vec<(ThreadId, PostId, PostOf)>, - threads: Vec, - category_by_moderator: Vec<(CategoryId, ModeratorId, ())>, - data_migration_done: bool, -} - -#[derive(Deserialize)] -struct EncodedForumData { - /// hex encoded categories - categories: Vec, - /// hex encoded posts - posts: Vec, - /// hex encoded threads - threads: Vec, - /// hex encoded categories by moderator set - category_by_moderator: Vec, - /// hex encoded data migration done bool flag - data_migration_done: String, -} - -impl EncodedForumData { - fn decode(&self) -> ForumData { - ForumData { - categories: self - .categories - .iter() - .map(|category| { - let encoded_category = hex::decode(&category[2..].as_bytes()) - .expect("failed to parse category hex string"); - Decode::decode(&mut encoded_category.as_slice()).unwrap() - }) - .collect(), - posts: self - .posts - .iter() - .map(|post| { - let encoded_post = hex::decode(&post[2..].as_bytes()) - .expect("failed to parse post hex string"); - Decode::decode(&mut encoded_post.as_slice()).unwrap() - }) - .collect(), - threads: self - .threads - .iter() - .map(|thread| { - let encoded_thread = hex::decode(&thread[2..].as_bytes()) - .expect("failed to parse thread hex string"); - Decode::decode(&mut encoded_thread.as_slice()).unwrap() - }) - .collect(), - category_by_moderator: self - .category_by_moderator - .iter() - .map(|category_by_moderator| { - let category_by_moderator = hex::decode(&category_by_moderator[2..].as_bytes()) - .expect("failed to parse thread hex string"); - Decode::decode(&mut category_by_moderator.as_slice()).unwrap() - }) - .collect(), - data_migration_done: { - let data_migration_done = hex::decode(&self.data_migration_done[2..].as_bytes()) - .expect("failed to parse thread hex string"); - Decode::decode(&mut data_migration_done.as_slice()).unwrap() - }, - } - } -} - -fn parse_forum_json(data_file: &Path) -> EncodedForumData { - let data = fs::read_to_string(data_file).expect("Failed reading file"); - serde_json::from_str(&data).expect("failed parsing members data") -} - -/// Generates a `ForumConfig` geneis config pre-populated with -/// categories, threads and posts parsed -/// from a json file serialized as `EncodedForumData` -pub fn from_json(forum_sudo: AccountId, data_file: &Path) -> ForumConfig { - let forum_data = parse_forum_json(data_file); - create(forum_sudo, forum_data) -} - -/// Generates a basic empty `ForumConfig` geneis config -pub fn empty(forum_sudo: AccountId) -> ForumConfig { - let forum_data = EncodedForumData { - categories: vec![], - threads: vec![], - posts: vec![], - category_by_moderator: vec![], - // true - data_migration_done: String::from("0x01"), - }; - create(forum_sudo, forum_data) -} - -fn create(_forum_sudo: AccountId, forum_data: EncodedForumData) -> ForumConfig { - let first_id = 1; - let forum_data = forum_data.decode(); - - let next_category_id = first_id + forum_data.categories.len() as CategoryId; - - assert_eq!( - next_category_id, - (forum_data.categories.len() + 1) as CategoryId - ); - - let next_thread_id = first_id + forum_data.threads.len() as ThreadId; - - assert_eq!(next_thread_id, (forum_data.threads.len() + 1) as ThreadId); - - let next_post_id = first_id + forum_data.posts.len() as PostId; - - assert_eq!(next_post_id, (forum_data.posts.len() + 1) as PostId); - - ForumConfig { - category_by_id: forum_data.categories, - thread_by_id: forum_data.threads, - post_by_id: forum_data.posts, - category_by_moderator: forum_data.category_by_moderator, - next_category_id, - next_thread_id, - next_post_id, - category_counter: next_category_id - 1, - data_migration_done: forum_data.data_migration_done, - } -} diff --git a/node/src/chain_spec/initial_balances.rs b/node/src/chain_spec/initial_balances.rs deleted file mode 100644 index e0f4a898fb..0000000000 --- a/node/src/chain_spec/initial_balances.rs +++ /dev/null @@ -1,18 +0,0 @@ -use node_runtime::{AccountId, Balance}; -use serde::Deserialize; -use std::{fs, path::Path}; - -#[derive(Deserialize)] -struct SerializedInitialBalances { - balances: Vec<(AccountId, Balance)>, -} - -fn parse_json(data_file: &Path) -> SerializedInitialBalances { - let data = fs::read_to_string(data_file).expect("Failed reading file"); - serde_json::from_str(&data).expect("failed parsing balances data") -} - -/// Deserializes initial balances from json file -pub fn from_json(data_file: &Path) -> Vec<(AccountId, Balance)> { - parse_json(data_file).balances -} diff --git a/node/src/chain_spec/initial_members.rs b/node/src/chain_spec/initial_members.rs deleted file mode 100644 index 2fd68a68b7..0000000000 --- a/node/src/chain_spec/initial_members.rs +++ /dev/null @@ -1,13 +0,0 @@ -use node_runtime::{membership, AccountId}; -use std::{fs, path::Path}; - -/// Generates a Vec of genesis members parsed from a json file -pub fn from_json(data_file: &Path) -> Vec> { - let data = fs::read_to_string(data_file).expect("Failed reading file"); - serde_json::from_str(&data).expect("failed parsing members data") -} - -/// Generates an empty Vec of genesis members -pub fn none() -> Vec> { - vec![] -} diff --git a/node/src/chain_spec/mod.rs b/node/src/chain_spec/mod.rs deleted file mode 100644 index 2aa99dfc9f..0000000000 --- a/node/src/chain_spec/mod.rs +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright 2019 Joystream Contributors -// This file is part of Joystream node. - -// Joystream node is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Joystream node is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Joystream node. If not, see . - -// Clippy linter warning. -// Disable it because we use such syntax for a code readability. -// Example: voting_period: 1 * DAY -#![allow(clippy::identity_op)] -// Remove after the Antioch release. -#![allow(clippy::unnecessary_wraps)] - -use pallet_im_online::sr25519::AuthorityId as ImOnlineId; -use serde_json as json; -use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; -use sp_consensus_babe::AuthorityId as BabeId; -use sp_core::{sr25519, Pair, Public}; -use sp_finality_grandpa::AuthorityId as GrandpaId; -use sp_runtime::traits::{IdentifyAccount, Verify}; -use sp_runtime::Perbill; - -use node_runtime::{ - membership, wasm_binary_unwrap, AuthorityDiscoveryConfig, BabeConfig, Balance, BalancesConfig, - ContentConfig, ForumConfig, GrandpaConfig, ImOnlineConfig, MembersConfig, SessionConfig, - SessionKeys, Signature, StakerStatus, StakingConfig, SudoConfig, SystemConfig, -}; - -// Exported to be used by chain-spec-builder -pub use node_runtime::{AccountId, GenesisConfig}; - -pub mod content_config; -pub mod council_config; -pub mod forum_config; -pub mod initial_balances; -pub mod initial_members; - -type AccountPublic = ::Signer; - -/// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type. -pub type ChainSpec = sc_service::GenericChainSpec; - -use sc_chain_spec::ChainType; - -/// The chain specification option. This is expected to come in from the CLI and -/// is little more than one of a number of alternatives which can easily be converted -/// from a string (`--chain=...`) into a `ChainSpec`. -#[derive(Clone, Debug)] -pub enum Alternative { - /// Whatever the current runtime is, with just Alice as an auth. - Development, - /// Whatever the current runtime is, with simple Alice/Bob auths. - LocalTestnet, -} - -/// Helper function to generate a crypto pair from seed -pub fn get_from_seed(seed: &str) -> ::Public { - TPublic::Pair::from_string(&format!("//{}", seed), None) - .expect("static values are valid; qed") - .public() -} - -/// Helper function to generate an account ID from seed -pub fn get_account_id_from_seed(seed: &str) -> AccountId -where - AccountPublic: From<::Public>, -{ - AccountPublic::from(get_from_seed::(seed)).into_account() -} - -/// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed( - seed: &str, -) -> ( - AccountId, - AccountId, - GrandpaId, - BabeId, - ImOnlineId, - AuthorityDiscoveryId, -) { - ( - get_account_id_from_seed::(&format!("{}//stash", seed)), - get_account_id_from_seed::(seed), - get_from_seed::(seed), - get_from_seed::(seed), - get_from_seed::(seed), - get_from_seed::(seed), - ) -} - -fn session_keys( - grandpa: GrandpaId, - babe: BabeId, - im_online: ImOnlineId, - authority_discovery: AuthorityDiscoveryId, -) -> SessionKeys { - SessionKeys { - grandpa, - babe, - im_online, - authority_discovery, - } -} - -impl Alternative { - /// Get an actual chain config from one of the alternatives. - pub(crate) fn load(self) -> Result { - Ok(match self { - Alternative::Development => ChainSpec::from_genesis( - "Development", - "dev", - ChainType::Development, - || { - testnet_genesis( - vec![get_authority_keys_from_seed("Alice")], - get_account_id_from_seed::("Alice"), - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - ], - initial_members::none(), - forum_config::empty(get_account_id_from_seed::("Alice")), - vec![], - content_config::testing_config(), - ) - }, - Vec::new(), - None, - None, - Some(chain_spec_properties()), - None, - ), - Alternative::LocalTestnet => ChainSpec::from_genesis( - "Local Testnet", - "local_testnet", - ChainType::Local, - || { - testnet_genesis( - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - vec![ - get_account_id_from_seed::("Alice"), - get_account_id_from_seed::("Bob"), - get_account_id_from_seed::("Charlie"), - get_account_id_from_seed::("Dave"), - get_account_id_from_seed::("Eve"), - get_account_id_from_seed::("Ferdie"), - get_account_id_from_seed::("Alice//stash"), - get_account_id_from_seed::("Bob//stash"), - get_account_id_from_seed::("Charlie//stash"), - get_account_id_from_seed::("Dave//stash"), - get_account_id_from_seed::("Eve//stash"), - get_account_id_from_seed::("Ferdie//stash"), - ], - initial_members::none(), - forum_config::empty(get_account_id_from_seed::("Alice")), - vec![], - content_config::testing_config(), - ) - }, - Vec::new(), - None, - None, - Some(chain_spec_properties()), - None, - ), - }) - } -} - -pub fn chain_spec_properties() -> json::map::Map { - let mut properties: json::map::Map = json::map::Map::new(); - properties.insert( - String::from("tokenDecimals"), - json::Value::Number(json::Number::from(0)), - ); - properties.insert( - String::from("tokenSymbol"), - json::Value::String(String::from("JOY")), - ); - properties -} -// This method should be refactored after Alexandria to reduce number of arguments -// as more args will likely be needed -#[allow(clippy::too_many_arguments)] -pub fn testnet_genesis( - initial_authorities: Vec<( - AccountId, - AccountId, - GrandpaId, - BabeId, - ImOnlineId, - AuthorityDiscoveryId, - )>, - root_key: AccountId, - endowed_accounts: Vec, - members: Vec>, - forum_config: ForumConfig, - initial_balances: Vec<(AccountId, Balance)>, - content_config: ContentConfig, -) -> GenesisConfig { - const STASH: Balance = 5_000; - const ENDOWMENT: Balance = 100_000_000; - - GenesisConfig { - frame_system: Some(SystemConfig { - code: wasm_binary_unwrap().to_vec(), - changes_trie_config: Default::default(), - }), - pallet_balances: Some(BalancesConfig { - balances: endowed_accounts - .iter() - .cloned() - .map(|k| (k, ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .chain( - initial_balances - .iter() - .map(|(account, balance)| (account.clone(), *balance)), - ) - .collect(), - }), - pallet_staking: Some(StakingConfig { - validator_count: 100, - minimum_validator_count: initial_authorities.len() as u32, - stakers: initial_authorities - .iter() - .map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)) - .collect(), - invulnerables: initial_authorities.iter().map(|x| x.0.clone()).collect(), - slash_reward_fraction: Perbill::from_percent(10), - history_depth: 336, - ..Default::default() - }), - pallet_sudo: Some(SudoConfig { key: root_key }), - pallet_babe: Some(BabeConfig { - authorities: vec![], - }), - pallet_im_online: Some(ImOnlineConfig { keys: vec![] }), - pallet_authority_discovery: Some(AuthorityDiscoveryConfig { keys: vec![] }), - pallet_grandpa: Some(GrandpaConfig { - authorities: vec![], - }), - pallet_session: Some(SessionConfig { - keys: initial_authorities - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - session_keys(x.2.clone(), x.3.clone(), x.4.clone(), x.5.clone()), - ) - }) - .collect::>(), - }), - referendum_Instance1: Some(council_config::create_referendum_config()), - council: Some(council_config::create_council_config()), - membership: Some(MembersConfig { members }), - forum: Some(forum_config), - content: Some(content_config), - } -} - -#[cfg(test)] -pub(crate) mod tests { - use super::*; - use crate::service::{new_full_base, new_light_base, NewFullBase}; - use sc_service_test; - - fn local_testnet_genesis_instant_single() -> GenesisConfig { - testnet_genesis( - vec![get_authority_keys_from_seed("Alice")], - get_account_id_from_seed::("Alice"), - vec![ - get_authority_keys_from_seed("Alice").0, - get_authority_keys_from_seed("Bob").0, - get_authority_keys_from_seed("Charlie").0, - get_authority_keys_from_seed("Alice").1, - get_authority_keys_from_seed("Bob").1, - get_authority_keys_from_seed("Charlie").1, - ], - initial_members::none(), - forum_config::empty(get_account_id_from_seed::("Alice")), - vec![], - content_config::testing_config(), - ) - } - - /// Local testnet config (single validator - Alice) - pub fn integration_test_config_with_single_authority() -> ChainSpec { - ChainSpec::from_genesis( - "Integration Test", - "test", - ChainType::Development, - local_testnet_genesis_instant_single, - vec![], - None, - None, - None, - Default::default(), - ) - } - - fn local_testnet_genesis() -> GenesisConfig { - testnet_genesis( - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - ], - get_account_id_from_seed::("Alice"), - vec![ - get_authority_keys_from_seed("Alice").0, - get_authority_keys_from_seed("Bob").0, - ], - initial_members::none(), - forum_config::empty(get_account_id_from_seed::("Alice")), - vec![], - content_config::testing_config(), - ) - } - - /// Local testnet config (multivalidator Alice + Bob) - pub fn integration_test_config_with_two_authorities() -> ChainSpec { - ChainSpec::from_genesis( - "Integration Test", - "test", - ChainType::Development, - local_testnet_genesis, - vec![], - None, - None, - None, - Default::default(), - ) - } - - #[test] - #[ignore] - fn test_connectivity() { - sc_service_test::connectivity( - integration_test_config_with_two_authorities(), - |config| { - let NewFullBase { - task_manager, - client, - network, - transaction_pool, - .. - } = new_full_base(config, |_, _| ())?; - Ok(sc_service_test::TestNetComponents::new( - task_manager, - client, - network, - transaction_pool, - )) - }, - |config| { - let (keep_alive, _, client, network, transaction_pool) = new_light_base(config)?; - Ok(sc_service_test::TestNetComponents::new( - keep_alive, - client, - network, - transaction_pool, - )) - }, - ); - } -} diff --git a/node/src/command.rs b/node/src/command.rs deleted file mode 100644 index 22f10885bc..0000000000 --- a/node/src/command.rs +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2019 Joystream Contributors -// This file is part of Joystream node. - -// Joystream node is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Joystream node is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Joystream node. If not, see . - -use crate::cli::{Cli, Subcommand}; -use crate::node_executor; -use crate::{chain_spec, service}; - -use crate::service::{new_full_base, new_partial, NewFullBase}; -use node_executor::Executor; -use node_runtime::{opaque::Block, RuntimeApi}; -use sc_cli::{ChainSpec, Result, Role, RuntimeVersion, SubstrateCli}; -use sc_service::PartialComponents; - -impl SubstrateCli for Cli { - fn impl_name() -> String { - "Joystream Node".into() - } - - fn support_url() -> String { - "https://www.joystream.org/".into() - } - - fn copyright_start_year() -> i32 { - 2019 - } - - fn executable_name() -> String { - "joystream-node".into() - } - - fn impl_version() -> String { - env!("SUBSTRATE_CLI_IMPL_VERSION").into() - } - - fn description() -> String { - env!("CARGO_PKG_DESCRIPTION").into() - } - - fn author() -> String { - env!("CARGO_PKG_AUTHORS").into() - } - - fn native_runtime_version(_: &Box) -> &'static RuntimeVersion { - &node_runtime::VERSION - } - - fn load_spec(&self, id: &str) -> std::result::Result, String> { - Ok(match id { - "dev" => Box::new(chain_spec::Alternative::Development.load()?), - "local" => Box::new(chain_spec::Alternative::LocalTestnet.load()?), - path => Box::new(chain_spec::ChainSpec::from_json_file( - std::path::PathBuf::from(path), - )?), - }) - } -} - -/// Parse command line arguments into service configuration. -pub fn run() -> Result<()> { - let cli = Cli::from_args(); - - match &cli.subcommand { - None => { - let runner = cli.create_runner(&cli.run)?; - runner.run_node_until_exit(|config| match config.role { - Role::Light => service::new_light(config), - _ => service::new_full(config), - }) - } - Some(Subcommand::Inspect(cmd)) => { - let runner = cli.create_runner(cmd)?; - - runner.sync_run(|config| cmd.run::(config)) - } - Some(Subcommand::Benchmark(cmd)) => { - if cfg!(feature = "runtime-benchmarks") { - let runner = cli.create_runner(cmd)?; - - runner.sync_run(|config| cmd.run::(config)) - } else { - Err("Benchmarking wasn't enabled when building the node. \ - You can enable it with `--features runtime-benchmarks`." - .into()) - } - } - Some(Subcommand::Key(cmd)) => cmd.run(), - Some(Subcommand::Sign(cmd)) => cmd.run(), - Some(Subcommand::Verify(cmd)) => cmd.run(), - Some(Subcommand::Vanity(cmd)) => cmd.run(), - Some(Subcommand::BuildSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) - } - Some(Subcommand::BuildSyncSpec(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let chain_spec = config.chain_spec.cloned_box(); - let network_config = config.network.clone(); - let NewFullBase { - task_manager, - client, - network_status_sinks, - .. - } = new_full_base(config, |_, _| ())?; - - Ok(( - cmd.run(chain_spec, network_config, client, network_status_sinks), - task_manager, - )) - }) - } - Some(Subcommand::CheckBlock(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { - client, - task_manager, - import_queue, - .. - } = new_partial(&config)?; - Ok((cmd.run(client, import_queue), task_manager)) - }) - } - Some(Subcommand::ExportBlocks(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { - client, - task_manager, - .. - } = new_partial(&config)?; - Ok((cmd.run(client, config.database), task_manager)) - }) - } - Some(Subcommand::ExportState(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { - client, - task_manager, - .. - } = new_partial(&config)?; - Ok((cmd.run(client, config.chain_spec), task_manager)) - }) - } - Some(Subcommand::ImportBlocks(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { - client, - task_manager, - import_queue, - .. - } = new_partial(&config)?; - Ok((cmd.run(client, import_queue), task_manager)) - }) - } - Some(Subcommand::PurgeChain(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| cmd.run(config.database)) - } - Some(Subcommand::Revert(cmd)) => { - let runner = cli.create_runner(cmd)?; - runner.async_run(|config| { - let PartialComponents { - client, - task_manager, - backend, - .. - } = new_partial(&config)?; - Ok((cmd.run(client, backend), task_manager)) - }) - } - } -} diff --git a/node/src/lib.rs b/node/src/lib.rs deleted file mode 100644 index 5db622eeb7..0000000000 --- a/node/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod chain_spec; -pub mod cli; -#[macro_use] -pub mod service; -pub mod command; -pub mod node_executor; -pub mod node_rpc; diff --git a/node/src/node_executor.rs b/node/src/node_executor.rs deleted file mode 100644 index 665ca94898..0000000000 --- a/node/src/node_executor.rs +++ /dev/null @@ -1,10 +0,0 @@ -use sc_executor::native_executor_instance; - -// Declare an instance of the native executor named `Executor`. Include the wasm binary as the -// equivalent wasm code. -native_executor_instance!( - pub Executor, - node_runtime::api::dispatch, - node_runtime::native_version, - frame_benchmarking::benchmarking::HostFunctions, -); diff --git a/node/src/service.rs b/node/src/service.rs deleted file mode 100644 index edc6aa444a..0000000000 --- a/node/src/service.rs +++ /dev/null @@ -1,787 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#![warn(unused_extern_crates)] -// Substrate implementation issue. -#![allow(clippy::redundant_closure_call)] -// Substrate implementation issue. -#![allow(clippy::type_complexity)] -// Substrate implementation issue. -#![allow(clippy::redundant_clone)] - -//! Service implementation. Specialized wrapper over substrate service. - -use crate::node_executor; -use crate::node_rpc; -use sc_finality_grandpa as grandpa; - -use futures::prelude::*; -use node_executor::Executor; -use node_runtime::opaque::Block; -use node_runtime::RuntimeApi; -use sc_client_api::{ExecutorProvider, RemoteBackend}; -use sc_finality_grandpa::FinalityProofProvider as GrandpaFinalityProofProvider; -use sc_network::{Event, NetworkService}; -use sc_service::{ - config::{Configuration, Role}, - error::Error as ServiceError, - RpcHandlers, TaskManager, -}; -use sp_core::traits::BareCryptoStorePtr; -use sp_inherents::InherentDataProviders; -use sp_runtime::traits::Block as BlockT; -use std::sync::Arc; - -type FullClient = sc_service::TFullClient; -type FullBackend = sc_service::TFullBackend; -type FullSelectChain = sc_consensus::LongestChain; -type FullGrandpaBlockImport = - grandpa::GrandpaBlockImport; -type LightClient = sc_service::TLightClient; - -pub fn new_partial( - config: &Configuration, -) -> Result< - sc_service::PartialComponents< - FullClient, - FullBackend, - FullSelectChain, - sp_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - ( - impl Fn(node_rpc::DenyUnsafe, sc_rpc::SubscriptionTaskExecutor) -> node_rpc::IoHandler, - ( - sc_consensus_babe::BabeBlockImport, - grandpa::LinkHalf, - sc_consensus_babe::BabeLink, - ), - ( - grandpa::SharedVoterState, - Arc>, - ), - ), - >, - ServiceError, -> { - let (client, backend, keystore, task_manager) = - sc_service::new_full_parts::(&config)?; - let client = Arc::new(client); - - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - - let transaction_pool = sc_transaction_pool::BasicPool::new_full( - config.transaction_pool.clone(), - config.prometheus_registry(), - task_manager.spawn_handle(), - client.clone(), - ); - - let (grandpa_block_import, grandpa_link) = grandpa::block_import( - client.clone(), - &(client.clone() as Arc<_>), - select_chain.clone(), - )?; - let justification_import = grandpa_block_import.clone(); - - let (block_import, babe_link) = sc_consensus_babe::block_import( - sc_consensus_babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let inherent_data_providers = sp_inherents::InherentDataProviders::new(); - - let import_queue = sc_consensus_babe::import_queue( - babe_link.clone(), - block_import.clone(), - Some(Box::new(justification_import)), - None, - client.clone(), - select_chain.clone(), - inherent_data_providers.clone(), - &task_manager.spawn_handle(), - config.prometheus_registry(), - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()), - )?; - - let import_setup = (block_import, grandpa_link, babe_link); - - let (rpc_extensions_builder, rpc_setup) = { - let (_, grandpa_link, babe_link) = &import_setup; - - let justification_stream = grandpa_link.justification_stream(); - let shared_authority_set = grandpa_link.shared_authority_set().clone(); - let shared_voter_state = grandpa::SharedVoterState::empty(); - let finality_proof_provider = - GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - - let rpc_setup = (shared_voter_state.clone(), finality_proof_provider.clone()); - - let babe_config = babe_link.config().clone(); - let shared_epoch_changes = babe_link.epoch_changes().clone(); - - let client = client.clone(); - let pool = transaction_pool.clone(); - let select_chain = select_chain.clone(); - let keystore = keystore.clone(); - - let rpc_extensions_builder = move |deny_unsafe, subscription_executor| { - let deps = node_rpc::FullDeps { - client: client.clone(), - pool: pool.clone(), - select_chain: select_chain.clone(), - deny_unsafe, - babe: node_rpc::BabeDeps { - babe_config: babe_config.clone(), - shared_epoch_changes: shared_epoch_changes.clone(), - keystore: keystore.clone(), - }, - grandpa: node_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - justification_stream: justification_stream.clone(), - subscription_executor, - finality_provider: finality_proof_provider.clone(), - }, - }; - - node_rpc::create_full(deps) - }; - - (rpc_extensions_builder, rpc_setup) - }; - - Ok(sc_service::PartialComponents { - client, - backend, - task_manager, - keystore, - select_chain, - import_queue, - transaction_pool, - inherent_data_providers, - other: (rpc_extensions_builder, import_setup, rpc_setup), - }) -} - -pub struct NewFullBase { - pub task_manager: TaskManager, - pub inherent_data_providers: InherentDataProviders, - pub client: Arc, - pub network: Arc::Hash>>, - pub network_status_sinks: sc_service::NetworkStatusSinks, - pub transaction_pool: Arc>, -} - -/// Creates a full service from the configuration. -pub fn new_full_base( - config: Configuration, - with_startup_data: impl FnOnce( - &sc_consensus_babe::BabeBlockImport, - &sc_consensus_babe::BabeLink, - ), -) -> Result { - let sc_service::PartialComponents { - client, - backend, - mut task_manager, - import_queue, - keystore, - select_chain, - transaction_pool, - inherent_data_providers, - other: (rpc_extensions_builder, import_setup, rpc_setup), - } = new_partial(&config)?; - - let (shared_voter_state, finality_proof_provider) = rpc_setup; - - let (network, network_status_sinks, system_rpc_tx, network_starter) = - sc_service::build_network(sc_service::BuildNetworkParams { - config: &config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - spawn_handle: task_manager.spawn_handle(), - import_queue, - on_demand: None, - block_announce_validator_builder: None, - finality_proof_request_builder: None, - finality_proof_provider: Some(finality_proof_provider.clone()), - })?; - - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - backend.clone(), - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - - let role = config.role.clone(); - let force_authoring = config.force_authoring; - let name = config.network.node_name.clone(); - let enable_grandpa = !config.disable_grandpa; - let prometheus_registry = config.prometheus_registry().cloned(); - let telemetry_connection_sinks = sc_service::TelemetryConnectionSinks::default(); - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - config, - backend: backend.clone(), - client: client.clone(), - keystore: keystore.clone(), - network: network.clone(), - rpc_extensions_builder: Box::new(rpc_extensions_builder), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - on_demand: None, - remote_blockchain: None, - telemetry_connection_sinks: telemetry_connection_sinks.clone(), - network_status_sinks: network_status_sinks.clone(), - system_rpc_tx, - })?; - - let (block_import, grandpa_link, babe_link) = import_setup; - - (with_startup_data)(&block_import, &babe_link); - - if let sc_service::config::Role::Authority { .. } = &role { - let proposer = sc_basic_authorship::ProposerFactory::new( - client.clone(), - transaction_pool.clone(), - prometheus_registry.as_ref(), - ); - - let can_author_with = - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); - - let babe_config = sc_consensus_babe::BabeParams { - keystore: keystore.clone(), - client: client.clone(), - select_chain, - env: proposer, - block_import, - sync_oracle: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - force_authoring, - babe_link, - can_author_with, - }; - - let babe = sc_consensus_babe::start_babe(babe_config)?; - task_manager - .spawn_essential_handle() - .spawn_blocking("babe-proposer", babe); - } - - // Spawn authority discovery module. - if matches!(role, Role::Authority { .. } | Role::Sentry { .. }) { - let (sentries, authority_discovery_role) = match role { - sc_service::config::Role::Authority { ref sentry_nodes } => ( - sentry_nodes.clone(), - sc_authority_discovery::Role::Authority(keystore.clone()), - ), - sc_service::config::Role::Sentry { .. } => { - (vec![], sc_authority_discovery::Role::Sentry) - } - _ => unreachable!("Due to outer matches! constraint; qed."), - }; - - let dht_event_stream = network - .event_stream("authority-discovery") - .filter_map(|e| async move { - match e { - Event::Dht(e) => Some(e), - _ => None, - } - }) - .boxed(); - let (authority_discovery_worker, _service) = sc_authority_discovery::new_worker_and_service( - client.clone(), - network.clone(), - sentries, - dht_event_stream, - authority_discovery_role, - prometheus_registry.clone(), - ); - - task_manager - .spawn_handle() - .spawn("authority-discovery-worker", authority_discovery_worker); - } - - // if the node isn't actively participating in consensus then it doesn't - // need a keystore, regardless of which protocol we use below. - let keystore = if role.is_authority() { - Some(keystore as BareCryptoStorePtr) - } else { - None - }; - - let config = grandpa::Config { - // FIXME #1578 make this available through chainspec - gossip_duration: std::time::Duration::from_millis(333), - justification_period: 512, - name: Some(name), - observer_enabled: false, - keystore, - is_authority: role.is_network_authority(), - }; - - if enable_grandpa { - // start the full GRANDPA voter - // NOTE: non-authorities could run the GRANDPA observer protocol, but at - // this point the full voter should provide better guarantees of block - // and vote data availability than the observer. The observer has not - // been tested extensively yet and having most nodes in a network run it - // could lead to finality stalls. - let grandpa_config = grandpa::GrandpaParams { - config, - link: grandpa_link, - network: network.clone(), - inherent_data_providers: inherent_data_providers.clone(), - telemetry_on_connect: Some(telemetry_connection_sinks.on_connect_stream()), - voting_rule: grandpa::VotingRulesBuilder::default().build(), - prometheus_registry, - shared_voter_state, - }; - - // the GRANDPA voter task is considered infallible, i.e. - // if it fails we take down the service with it. - task_manager - .spawn_essential_handle() - .spawn_blocking("grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)?); - } else { - grandpa::setup_disabled_grandpa(client.clone(), &inherent_data_providers, network.clone())?; - } - - network_starter.start_network(); - Ok(NewFullBase { - task_manager, - inherent_data_providers, - client, - network, - network_status_sinks, - transaction_pool, - }) -} - -/// Builds a new service for a full client. -pub fn new_full(config: Configuration) -> Result { - new_full_base(config, |_, _| ()).map(|NewFullBase { task_manager, .. }| task_manager) -} - -pub fn new_light_base( - config: Configuration, -) -> Result< - ( - TaskManager, - RpcHandlers, - Arc, - Arc::Hash>>, - Arc< - sc_transaction_pool::LightPool>, - >, - ), - ServiceError, -> { - let (client, backend, keystore, mut task_manager, on_demand) = - sc_service::new_light_parts::(&config)?; - - let select_chain = sc_consensus::LongestChain::new(backend.clone()); - - let transaction_pool = Arc::new(sc_transaction_pool::BasicPool::new_light( - config.transaction_pool.clone(), - config.prometheus_registry(), - task_manager.spawn_handle(), - client.clone(), - on_demand.clone(), - )); - - let grandpa_block_import = grandpa::light_block_import( - client.clone(), - backend.clone(), - &(client.clone() as Arc<_>), - Arc::new(on_demand.checker().clone()), - )?; - - let finality_proof_import = grandpa_block_import.clone(); - let finality_proof_request_builder = - finality_proof_import.create_finality_proof_request_builder(); - - let (babe_block_import, babe_link) = sc_consensus_babe::block_import( - sc_consensus_babe::Config::get_or_compute(&*client)?, - grandpa_block_import, - client.clone(), - )?; - - let inherent_data_providers = sp_inherents::InherentDataProviders::new(); - - let import_queue = sc_consensus_babe::import_queue( - babe_link, - babe_block_import, - None, - Some(Box::new(finality_proof_import)), - client.clone(), - select_chain.clone(), - inherent_data_providers.clone(), - &task_manager.spawn_handle(), - config.prometheus_registry(), - sp_consensus::NeverCanAuthor, - )?; - - let finality_proof_provider = - GrandpaFinalityProofProvider::new_for_service(backend.clone(), client.clone()); - - let (network, network_status_sinks, system_rpc_tx, network_starter) = - sc_service::build_network(sc_service::BuildNetworkParams { - config: &config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - spawn_handle: task_manager.spawn_handle(), - import_queue, - on_demand: Some(on_demand.clone()), - block_announce_validator_builder: None, - finality_proof_request_builder: Some(finality_proof_request_builder), - finality_proof_provider: Some(finality_proof_provider), - })?; - network_starter.start_network(); - - if config.offchain_worker.enabled { - sc_service::build_offchain_workers( - &config, - backend.clone(), - task_manager.spawn_handle(), - client.clone(), - network.clone(), - ); - } - - let light_deps = node_rpc::LightDeps { - remote_blockchain: backend.remote_blockchain(), - fetcher: on_demand.clone(), - client: client.clone(), - pool: transaction_pool.clone(), - }; - - let rpc_extensions = node_rpc::create_light(light_deps); - - let rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { - on_demand: Some(on_demand), - remote_blockchain: Some(backend.remote_blockchain()), - rpc_extensions_builder: Box::new(sc_service::NoopRpcExtensionBuilder(rpc_extensions)), - client: client.clone(), - transaction_pool: transaction_pool.clone(), - config, - keystore, - backend, - network_status_sinks, - system_rpc_tx, - network: network.clone(), - telemetry_connection_sinks: sc_service::TelemetryConnectionSinks::default(), - task_manager: &mut task_manager, - })?; - - Ok(( - task_manager, - rpc_handlers, - client, - network, - transaction_pool, - )) -} - -/// Builds a new service for a light client. -pub fn new_light(config: Configuration) -> Result { - new_light_base(config).map(|(task_manager, _, _, _, _)| task_manager) -} - -#[cfg(test)] -mod tests { - use crate::service::{new_full_base, new_light_base, NewFullBase}; - use codec::Encode; - use node_runtime::opaque::Block; - use node_runtime::{currency::CENTS, SLOT_DURATION}; - use node_runtime::{Address, BalancesCall, Call, UncheckedExtrinsic}; - use node_runtime::{DigestItem, Signature}; - use sc_client_api::BlockBackend; - use sc_consensus_babe::{BabeIntermediate, CompatibleDigestItem, INTERMEDIATE_KEY}; - use sc_consensus_epochs::descendent_query; - use sc_service_test::TestNetNode; - use sp_consensus::{ - BlockImport, BlockImportParams, BlockOrigin, Environment, ForkChoiceStrategy, Proposer, - RecordProof, - }; - use sp_core::{crypto::Pair as CryptoPair, H256}; - use sp_finality_tracker; - use sp_keyring::AccountKeyring; - use sp_runtime::traits::IdentifyAccount; - use sp_runtime::{ - generic::{BlockId, Digest, Era, SignedPayload}, - traits::Verify, - traits::{Block as BlockT, Header as HeaderT}, - }; - use sp_timestamp; - use sp_transaction_pool::{ChainEvent, MaintainedTransactionPool}; - use std::{any::Any, borrow::Cow, sync::Arc}; - - type AccountPublic = ::Signer; - - #[test] - // It is "ignored", but the node-cli ignored tests are running on the CI. - // This can be run locally with `cargo test --release -p node-cli test_sync -- --ignored`. - #[ignore] - fn test_sync() { - let keystore_path = tempfile::tempdir().expect("Creates keystore path"); - let keystore = - sc_keystore::Store::open(keystore_path.path(), None).expect("Creates keystore"); - let alice = keystore - .write() - .insert_ephemeral_from_seed::("//Alice") - .expect("Creates authority pair"); - - let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); - - // For the block factory - let mut slot_num = 1u64; - - // For the extrinsics factory - let bob = Arc::new(AccountKeyring::Bob.pair()); - let charlie = Arc::new(AccountKeyring::Charlie.pair()); - let mut index = 0; - - sc_service_test::sync( - chain_spec, - |config| { - let mut setup_handles = None; - let NewFullBase { - task_manager, - inherent_data_providers, - client, - network, - transaction_pool, - .. - } = new_full_base( - config, - |block_import: &sc_consensus_babe::BabeBlockImport, - babe_link: &sc_consensus_babe::BabeLink| { - setup_handles = Some((block_import.clone(), babe_link.clone())); - }, - )?; - - let node = sc_service_test::TestNetComponents::new( - task_manager, - client, - network, - transaction_pool, - ); - Ok((node, (inherent_data_providers, setup_handles.unwrap()))) - }, - |config| { - let (keep_alive, _, client, network, transaction_pool) = new_light_base(config)?; - Ok(sc_service_test::TestNetComponents::new( - keep_alive, - client, - network, - transaction_pool, - )) - }, - |service, &mut (ref inherent_data_providers, (ref mut block_import, ref babe_link))| { - let mut inherent_data = inherent_data_providers - .create_inherent_data() - .expect("Creates inherent data."); - inherent_data.replace_data(sp_finality_tracker::INHERENT_IDENTIFIER, &1u64); - - let parent_id = BlockId::number(service.client().chain_info().best_number); - let parent_header = service.client().header(&parent_id).unwrap().unwrap(); - let parent_hash = parent_header.hash(); - let parent_number = *parent_header.number(); - - futures::executor::block_on(service.transaction_pool().maintain( - ChainEvent::NewBestBlock { - hash: parent_header.hash(), - tree_route: None, - }, - )); - - let mut proposer_factory = sc_basic_authorship::ProposerFactory::new( - service.client(), - service.transaction_pool(), - None, - ); - - let epoch_descriptor = babe_link - .epoch_changes() - .lock() - .epoch_descriptor_for_child_of( - descendent_query(&*service.client()), - &parent_hash, - parent_number, - slot_num, - ) - .unwrap() - .unwrap(); - - let mut digest = Digest::::default(); - - // even though there's only one authority some slots might be empty, - // so we must keep trying the next slots until we can claim one. - let babe_pre_digest = loop { - inherent_data.replace_data( - sp_timestamp::INHERENT_IDENTIFIER, - &(slot_num * SLOT_DURATION), - ); - if let Some(babe_pre_digest) = sc_consensus_babe::test_helpers::claim_slot( - slot_num, - &parent_header, - &*service.client(), - &keystore, - &babe_link, - ) { - break babe_pre_digest; - } - - slot_num += 1; - }; - - digest.push(::babe_pre_digest( - babe_pre_digest, - )); - - let new_block = futures::executor::block_on(async move { - let proposer = proposer_factory.init(&parent_header).await; - proposer - .unwrap() - .propose( - inherent_data, - digest, - std::time::Duration::from_secs(1), - RecordProof::Yes, - ) - .await - }) - .expect("Error making test block") - .block; - - let (new_header, new_body) = new_block.deconstruct(); - let pre_hash = new_header.hash(); - // sign the pre-sealed hash of the block and then - // add it to a digest item. - let to_sign = pre_hash.encode(); - let signature = alice.sign(&to_sign[..]); - let item = ::babe_seal(signature.into()); - slot_num += 1; - - let mut params = BlockImportParams::new(BlockOrigin::File, new_header); - params.post_digests.push(item); - params.body = Some(new_body); - params.intermediates.insert( - Cow::from(INTERMEDIATE_KEY), - Box::new(BabeIntermediate:: { epoch_descriptor }) as Box, - ); - params.fork_choice = Some(ForkChoiceStrategy::LongestChain); - - block_import - .import_block(params, Default::default()) - .expect("error importing test block"); - }, - |service, _| { - let amount = 5 * CENTS; - let to: Address = AccountPublic::from(bob.public()).into_account().into(); - let from: Address = AccountPublic::from(charlie.public()).into_account().into(); - let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); - let best_block_id = BlockId::number(service.client().chain_info().best_number); - let (spec_version, transaction_version) = { - let version = service.client().runtime_version_at(&best_block_id).unwrap(); - (version.spec_version, version.transaction_version) - }; - let signer = charlie.clone(); - - let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); - - let check_spec_version = frame_system::CheckSpecVersion::new(); - let check_tx_version = frame_system::CheckTxVersion::new(); - let check_genesis = frame_system::CheckGenesis::new(); - let check_era = frame_system::CheckEra::from(Era::Immortal); - let check_nonce = frame_system::CheckNonce::from(index); - let check_weight = frame_system::CheckWeight::new(); - let payment = pallet_transaction_payment::ChargeTransactionPayment::from(0); - let extra = ( - check_spec_version, - check_tx_version, - check_genesis, - check_era, - check_nonce, - check_weight, - payment, - ); - let raw_payload = SignedPayload::from_raw( - function, - extra, - ( - spec_version, - transaction_version, - genesis_hash, - genesis_hash, - (), - (), - (), - ), - ); - let signature = raw_payload.using_encoded(|payload| signer.sign(payload)); - let (function, extra, _) = raw_payload.deconstruct(); - index += 1; - UncheckedExtrinsic::new_signed(function, from.into(), signature.into(), extra) - .into() - }, - ); - } - - #[test] - #[ignore] - fn test_consensus() { - sc_service_test::consensus( - crate::chain_spec::tests::integration_test_config_with_two_authorities(), - |config| { - let NewFullBase { - task_manager, - client, - network, - transaction_pool, - .. - } = new_full_base(config, |_, _| ())?; - Ok(sc_service_test::TestNetComponents::new( - task_manager, - client, - network, - transaction_pool, - )) - }, - |config| { - let (keep_alive, _, client, network, transaction_pool) = new_light_base(config)?; - Ok(sc_service_test::TestNetComponents::new( - keep_alive, - client, - network, - transaction_pool, - )) - }, - vec!["//Alice".into(), "//Bob".into()], - ) - } -} diff --git a/package.json b/package.json index c172f0f264..8e43922b8c 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,9 @@ "build:packages": "./build-packages.sh", "setup": "./setup.sh", "start": "./start.sh", - "cargo-checks": "./devops/git-hooks/pre-commit && ./devops/git-hooks/pre-push", + "cargo-checks": "./scripts/cargo-checks.sh", "cargo-build": "./scripts/cargo-build.sh", + "lint": "./scripts/lint-typescript.sh", "update-chain-metadata": "./scripts/fetch-chain-metadata.sh > chain-metadata.json", "verify-chain-metadata": "./scripts/verify-chain-metadata.sh" }, @@ -18,7 +19,9 @@ "cli", "types", "storage-node", + "storage-node/client", "distributor-node", + "distributor-node/client", "devops/eslint-config", "devops/prettier-config", "utils/api-scripts", @@ -29,24 +32,25 @@ "metadata-protobuf" ], "resolutions": { - "@polkadot/api": "5.9.1", - "@polkadot/api-contract": "5.9.1", - "@polkadot/keyring": "7.3.1", - "@polkadot/types": "5.9.1", - "@polkadot/types-known": "5.9.1", - "@polkadot/util": "7.3.1", - "@polkadot/util-crypto": "7.3.1", - "@polkadot/api-derive": "5.9.1", - "@polkadot/rpc-core": "5.9.1", - "@polkadot/rpc-provider": "5.9.1", - "@polkadot/x-global": "7.3.1", - "@polkadot/networks": "7.3.1", + "@polkadot/api": "8.9.1", + "@polkadot/keyring": "9.5.1", + "@polkadot/types": "8.9.1", + "@polkadot/util": "9.5.1", + "@polkadot/util-crypto": "9.5.1", + "@polkadot/networks": "9.5.1", + "@polkadot/x-fetch": "9.5.1", + "@polkadot/x-global": "9.5.1", + "@polkadot/x-ws": "9.5.1", "typescript": "^4.4.3", - "bn.js": "4.12.0", + "bn.js": "^5.2.1", "rxjs": "^7.4.0", - "typeorm": "0.2.34", + "typeorm": "https://github.com/Joystream/typeorm/releases/download/0.3.5/typeorm-v0.3.5.tgz", + "graphql": "^15.3.0", + "graphql-tools": "^4.0.8", "pg": "^8.4.0", - "chalk": "^4.0.0" + "chalk": "^4.0.0", + "@types/bn.js": "^5.1.0", + "@substrate/txwrapper-core": "=3.1.3" }, "devDependencies": { "eslint": "^7.25.0", diff --git a/query-node/CHANGELOG.md b/query-node/CHANGELOG.md index 6e6283cedf..7ccc0349e8 100644 --- a/query-node/CHANGELOG.md +++ b/query-node/CHANGELOG.md @@ -4,6 +4,7 @@ Most of the events processed by the query node are now mapped to corresponding `{event_name}Event` entities, which implement the [`Event`](./schemas/common.graphql) interface. Events of different types can be queried together, for example, take a look at the query below: + ```graphql { events( @@ -73,7 +74,9 @@ Events of different types can be queried together, for example, take a look at t } } ``` + There is a separate file with the event input schemas for each module that has some events mapped to entities: + - [`membershipEvents.graphql`](./schemas/membershipEvents.graphql) - [`councilEvents.graphql`](./schemas/councilEvents.graphql) - [`forumEvents.graphql`](./schemas/forumEvents.graphql) @@ -84,6 +87,7 @@ There is a separate file with the event input schemas for each module that has s ### New mappings Runtime modules for which the mappings have been introduced in Olympia (there were no mappings in Giza): + - [Council](./schemas/council.graphql) - [Forum](./schemas/forum.graphql) - [Proposals](./schemas/proposals.graphql) @@ -92,6 +96,7 @@ Runtime modules for which the mappings have been introduced in Olympia (there we ### Changes in existing schemas & mappings #### [Memberships](./schemas/membership.graphql) + - `avatarUri` and `about` fields have been removed from `Membership` entity. They are now part of `MemberMetadata`, along with the new `name` field. Additionally, `avatarUri` is now of `Avatar` union type with `AvatarUri` and `AvatarObject` variants. Currently only `AvatarUri` variant is actually being used. - `MembershipEntryMethod` (`Membership.entry`) is now an `union` (previously an `enum`) with 3 variants: `MembershipEntryPaid`, `MembershipEntryInvited` and `MembershipEntryGenesis`. The first two include a reference to the event which caused the membership to be created (`MembershipBoughtEvent` / `MemberInvitedEvent`) - `createdInBlock` field has been removed from the `Membership` entity. Use `.entry.{membershipBoughtEvent|memberInvitedEvent}.inBlock` instead. @@ -100,7 +105,8 @@ Runtime modules for which the mappings have been introduced in Olympia (there we - A new `MembershipSystemSnapshot` entity has been introduced, which describes a snapshot of the membership system configuration parameters that can be changed through proposals. Those include default invitations count for new members, membership price, referral cut and initial balance of an invited member. #### [Working groups](./schemas/workingGroups.graphql) -- All working groups are now supported by the query node (previously only `Gateway` and `Storage` groups were supported) + +- All working groups are now supported by the query node (previously only `Apps` and `Storage` groups were supported) - `Worker.id` now has a `{workingGroupModuleName}-{workerId}` format, for example: `storageWorkingGroup-1`. - `Worker.isActive` field has been removed in favor of `Worker.status` union (Note that `isActive` may be re-introduced after https://github.com/Joystream/joystream/issues/2657) - `Worker.type` enum has been replaced by `Worker.group`, which is a reference to the new `WorkingGroup` entity (each supported group has a corresponding `WorkingGroup` record). diff --git a/query-node/README.md b/query-node/README.md index a06f1bfd46..2adb5f8923 100644 --- a/query-node/README.md +++ b/query-node/README.md @@ -32,6 +32,7 @@ yarn workspace query-node-root start ``` This script script will: + - Bring up `joystream-node` service (if not already started) - Bring up `db` service (query node is using a PostgreSQL database to store the data) - Configure the database (`yarn workspace query-node config:dev`) @@ -54,31 +55,37 @@ yarn workspace query-node-root kill Follow the links for more information about the [indexer](https://github.com/Joystream/hydra/tree/master/packages/hydra-indexer) service and [indexer-api-gateway](https://github.com/Joystream/hydra/tree/master/packages/hydra-indexer-gateway). ## GraphQL Playground assets url -Query node's user interface, GraphQL Playground, is expecting to be served at `/graphql`. + +Query node's user interface, GraphQL Playground, is expecting to be served at `/graphql`. If you are serving the files on path like `/query/server/graphql` via some nginx proxy, aliasing, etc. you will need to provide the base url to query node server via `GRAPHQL_PLAYGROUND_CDN` environment variable. ``` # use the following when serving playground at `/query/server/graphql` -GRAPHQL_PLAYGROUND_CDN="query/server" yarn workspace query-node-root query-node:start:dev +GRAPHQL_PLAYGROUND_CDN="query/server" yarn workspace query-node-root query-node:start:dev ``` + ## Development Run integration tests + ``` ./query-node/run-tests.sh ``` To run tests and keep services alive for further inspection, set `DEBUG` shell variable to any true-ish value. + ``` DEBUG=true ./query-node/run-tests.sh ``` + You can then use queries manually in GraphQL Playground (http://localhost:8081/graphql), see docker logs (e.g. `docker logs processor`), etc. After running tests in debug mode, you can run more testing scenarios or repeat some. This assumes the scenario is repeatable and any previous test errors didn't break the blockchain or processor state in a critical way. + ``` DEBUG=true ./query-node/run-tests.sh # run tests first and make sure services stay alive REUSE_KEYS=true yarn workspace network-tests run-test-scenario content-directory @@ -88,9 +95,11 @@ Commenting out some of the scenario's flow calls in `network-tests/src/scenarios scope of development or debugging might speed out the process. ### Processor setups + **Running processor with local Joystream node and local indexer.** It's useful when you want to interact with Joystream node via Pioneer or Atlas and want to check results processed by the processor. + ``` docker-compose up -d joystream-node indexer hydra-indexer-gateway processor @@ -101,6 +110,7 @@ docker-compose up -d graphql-server **Running processor with remote Joystream node and local indexer.** It's useful when you want to synchronize the indexer and processor with Joystream node hosted remotely from scratch. You can analyze any errors in docker logs and tweak mappings. + ``` JOYSTREAM_NODE_WS=wss://target-domain.tmp/ws-rpc docker-compose up -d indexer hydra-indexer-gateway processor ``` @@ -108,11 +118,13 @@ JOYSTREAM_NODE_WS=wss://target-domain.tmp/ws-rpc docker-compose up -d indexer hy **Running processor with remote Joystream node and remote indexer.** When debugging an error that happened in processor mappings on a remote server that has its own indexer, you can use it and skip potentially time-consuming indexer synchronization + ``` PROCESSOR_INDEXER_GATEWAY=https://target-domain.tmp/query-node/indexer/graphql docker-compose up -d processor ``` ### Restart processor from the beginning + When debugging an error in mappings that breaks the state and processor needs to be restarted and mappings processed from the beginning, use the following commands. @@ -128,6 +140,7 @@ docker-compose up -d processor # start processor again ``` ### Debugging Hydra errors + In situations when an error inside of Hydra occurs but it's not clear what event caused the issue, it might help to add `console.log(nextBlock.events)` to `node_modules/@joystream/hydra-processor/lib/process/MappingsProcessor.js`'s `processBlock` function diff --git a/query-node/build.sh b/query-node/build.sh index e6862b1bd3..386062c122 100755 --- a/query-node/build.sh +++ b/query-node/build.sh @@ -14,9 +14,16 @@ yarn --cwd codegen install yarn clean yarn codegen:noinstall -cp mappings/queryTemplates.ts generated/graphql-server/src/ +cp mappings/src/queryTemplates.ts generated/graphql-server/src/ yarn typegen # if this fails try to run this command outside of yarn workspaces +################################################ +# temporary patches TODO: create proper solution + +sed -i -e "s#new TypeRegistry();#new TypeRegistry() as any;#" ./mappings/generated/types/index.ts + +################################################ + # We run yarn again to ensure graphql-server dependencies are installed # and are inline with root workspace resolutions yarn @@ -25,6 +32,7 @@ yarn ln -s ../../../../../node_modules/typeorm/cli.js ./generated/graphql-server/node_modules/.bin/typeorm yarn workspace query-node codegen + yarn workspace query-node build yarn workspace query-node-mappings build diff --git a/query-node/codegen/package.json b/query-node/codegen/package.json index 9f9f13a6aa..25b11f0fa6 100644 --- a/query-node/codegen/package.json +++ b/query-node/codegen/package.json @@ -5,8 +5,12 @@ "author": "", "license": "ISC", "scripts": {}, + "resolutions": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.2.0" + }, "dependencies": { - "@joystream/hydra-cli": "^3.1.0-alpha.26", - "@joystream/hydra-typegen": "^3.1.0-alpha.26" + "@joystream/hydra-cli": "4.0.0-alpha.9", + "@joystream/hydra-typegen": "4.0.0-alpha.9" } } diff --git a/query-node/codegen/yarn.lock b/query-node/codegen/yarn.lock index 0e628fea14..8443820c5d 100644 --- a/query-node/codegen/yarn.lock +++ b/query-node/codegen/yarn.lock @@ -33,9 +33,9 @@ dependencies: xss "^1.0.8" -"@apollographql/graphql-playground-react@https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.29/graphql-playground-react-v1.7.29.tgz": - version "1.7.29" - resolved "https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.29/graphql-playground-react-v1.7.29.tgz#bf0bf4a72f74de156ccf2a8638e7cb617a8b41e2" +"@apollographql/graphql-playground-react@https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.30/graphql-playground-react-v1.7.30.tgz": + version "1.7.30" + resolved "https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.30/graphql-playground-react-v1.7.30.tgz#7c8f996833154b44169f434520d3b2a66a5fb588" dependencies: "@types/lru-cache" "^4.1.1" apollo-link "^1.2.13" @@ -58,7 +58,7 @@ lodash.debounce "^4.0.8" markdown-it "^8.4.1" marked "^0.8.2" - prettier "2.0.2" + prettier "^2.6.3" prop-types "^15.7.2" query-string "5" react "16.13.1" @@ -205,10 +205,10 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.16.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" - integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== +"@babel/runtime@^7.18.3": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580" + integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ== dependencies: regenerator-runtime "^0.13.4" @@ -306,15 +306,15 @@ resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== -"@joystream/hydra-cli@^3.1.0-alpha.26": - version "3.1.0-alpha.26" - resolved "https://registry.yarnpkg.com/@joystream/hydra-cli/-/hydra-cli-3.1.0-alpha.26.tgz#c98f723e2f7891f9d700390d10ec2ea426cbfa53" - integrity sha512-sTsUPK11JlNp+wJh/lxCmh/Kycv2TyIPedIpmhhv+l0ghw6Sszh0xaj7yTfMJFpzueLxMi6xws84x8RRKdgpRw== +"@joystream/hydra-cli@4.0.0-alpha.9": + version "4.0.0-alpha.9" + resolved "https://registry.yarnpkg.com/@joystream/hydra-cli/-/hydra-cli-4.0.0-alpha.9.tgz#101da208f451c90ffc42634393714e3fdfe243af" + integrity sha512-CLY0vqXU4QQY7n+B8UyNhbbrfACTzXQJc6J5CUyYKxL04mgKps5olHrX9b4XdDeHqcYWhzUKE5+JbEoDy+7f2A== dependencies: "@inquirer/input" "^0.0.13-alpha.0" "@inquirer/password" "^0.0.12-alpha.0" "@inquirer/select" "^0.0.13-alpha.0" - "@joystream/warthog" "^2.41.4" + "@joystream/warthog" "^2.41.9" "@oclif/command" "^1.5.20" "@oclif/config" "^1" "@oclif/errors" "^1.3.3" @@ -342,28 +342,29 @@ pluralize "^8.0.0" tslib "1.11.2" -"@joystream/hydra-typegen@^3.1.0-alpha.26": - version "3.1.0-alpha.26" - resolved "https://registry.yarnpkg.com/@joystream/hydra-typegen/-/hydra-typegen-3.1.0-alpha.26.tgz#cbe88a4b33a1a6c2c95a91656545e2ce85fa9d36" - integrity sha512-y4DnunyIcMPKnqYaa7CFMmqlv/F6jNeUTPDbkjM5ESWcCqE1qQOCVl8LqkEfrKaGOV6RET9iTE/KPA9Swzq1jw== +"@joystream/hydra-typegen@4.0.0-alpha.9": + version "4.0.0-alpha.9" + resolved "https://registry.yarnpkg.com/@joystream/hydra-typegen/-/hydra-typegen-4.0.0-alpha.9.tgz#815045129957cc070905982fbafdc1570f42e65e" + integrity sha512-GhQNRLGOuT5ZpTuTkjt74oN/uV3gDQdokSPAjJeOtKc6iyh5Y3mPWbCU1Qa23zCqMaeMEbTzpeLWnCd8Bf8McA== dependencies: "@oclif/command" "^1.8.0" "@oclif/config" "^1" "@oclif/errors" "^1.3.3" - "@polkadot/api" "5.9.1" + "@polkadot/api" "8.9.1" debug "^4.3.1" + figlet "^1.5.2" handlebars "^4.7.6" lodash "^4.17.20" ws "^8.2.2" yaml "^1.10.0" yaml-validator "^3.0.0" -"@joystream/warthog@^2.41.4": - version "2.41.4" - resolved "https://registry.yarnpkg.com/@joystream/warthog/-/warthog-2.41.4.tgz#4b0a396d9d6eee9e469a36b1ca1c86c3890d56d6" - integrity sha512-yfGgrjbg3alGR+7g1NcSTdlpYtgH0kDFNDSKFWiYFEPNsjwwCBgWnsVQ+ED1PWAa2RhUhwp9J4dsI5U21P543A== +"@joystream/warthog@^2.41.9": + version "2.41.9" + resolved "https://registry.yarnpkg.com/@joystream/warthog/-/warthog-2.41.9.tgz#7cfb16df80cb43339e541026af09ff38909eae82" + integrity sha512-4RUZYueSyv3KILsNeUAtCNPpNm0odp0aLSdRHt3E/DvFTQRyjPEwM7CvvqpLAKHdJY1AP8ntLQCUxWXL888ioA== dependencies: - "@apollographql/graphql-playground-react" "https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.29/graphql-playground-react-v1.7.29.tgz" + "@apollographql/graphql-playground-react" "https://github.com/Joystream/graphql-playground/releases/download/graphql-playground-react%401.7.30/graphql-playground-react-v1.7.30.tgz" "@types/app-root-path" "^1.2.4" "@types/bn.js" "^4.11.6" "@types/caller" "^1.0.0" @@ -371,10 +372,7 @@ "@types/debug" "^4.1.5" "@types/dotenv" "^8.2.0" "@types/express" "^4.17.2" - "@types/graphql" "^14.5.0" - "@types/graphql-fields" "^1.3.2" - "@types/graphql-iso-date" "^3.3.3" - "@types/graphql-type-json" "^0.3.2" + "@types/graphql-fields" "^1.3.4" "@types/isomorphic-fetch" "^0.0.35" "@types/lodash" "^4.14.148" "@types/mkdirp" "^0.5.2" @@ -382,7 +380,7 @@ "@types/node-emoji" "^1.8.1" "@types/open" "^6.2.1" "@types/pg" "^7.14.11" - "@types/prettier" "^1.18.3" + "@types/prettier" "^2.6.3" "@types/shortid" "^0.0.29" "@types/ws" "^6.0.3" apollo-link-error "^1.1.12" @@ -401,13 +399,12 @@ execa "^4.0.3" express "^4.17.1" gluegun "^4.1.0" - graphql "^14.5.8" + graphql "^15.8.0" graphql-binding "^2.5.2" graphql-fields "^2.0.3" graphql-import-node "^0.0.4" graphql-iso-date "^3.6.1" graphql-scalars "^1.2.6" - graphql-tools "^4.0.6" graphql-type-json "^0.3.0" lodash "^4.17.15" mkdirp "^0.5.1" @@ -415,15 +412,25 @@ open "^7.0.0" pg "^8.6.0" pgtools "^0.3.1" - prettier "^1.19.1" + prettier "^2.6.3" reflect-metadata "^0.1.13" shortid "^2.2.15" - type-graphql "^0.17.5" + type-graphql "^1.1.1" typedi "^0.8.0" - typeorm "0.2.37" + typeorm "https://github.com/Joystream/typeorm/releases/download/0.3.5/typeorm-v0.3.5.tgz" typeorm-typedi-extensions "^0.4.1" typescript "^4.4" +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" + integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -560,204 +567,329 @@ resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== -"@polkadot/api-derive@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-5.9.1.tgz#5937069920ded1439e6672b9d6be1072421b256b" - integrity sha512-iMrVKnYIS3UQciDlFqww6AFyXgG+iN8UqWu8QbTuZecri3qrSmM3Nn8Jkvju3meZIacwWIMSmBcnj8+zef3rkQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/api" "5.9.1" - "@polkadot/rpc-core" "5.9.1" - "@polkadot/types" "5.9.1" - "@polkadot/util" "^7.3.1" - "@polkadot/util-crypto" "^7.3.1" - rxjs "^7.3.0" - -"@polkadot/api@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-5.9.1.tgz#ce314cc34f0a47098d039db7b9036bb491c2898c" - integrity sha512-POpIXn/Ao+NLB0uMldXdXU44dVbRr6+6Ax77Z0R285M8Z2EiF5jl2K3SPvlowLo4SntxiCSaHQxCekYhUcJKlw== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/api-derive" "5.9.1" - "@polkadot/keyring" "^7.3.1" - "@polkadot/rpc-core" "5.9.1" - "@polkadot/rpc-provider" "5.9.1" - "@polkadot/types" "5.9.1" - "@polkadot/types-known" "5.9.1" - "@polkadot/util" "^7.3.1" - "@polkadot/util-crypto" "^7.3.1" +"@polkadot/api-augment@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-8.9.1.tgz#25b0997ccf3d1df4641123e0d9ec29e8fb03ef62" + integrity sha512-yobYURNgoZcZD3QJmE34n3ZcEEUtsiivquckxjJMXnHJv3zahMyJh75tCNAXjzWn+e+SqKTVlgCpLXYlC1HJPQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/api-base" "8.9.1" + "@polkadot/rpc-augment" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-augment" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/util" "^9.5.1" + +"@polkadot/api-base@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-8.9.1.tgz#e0013bbb8e72678a4eecdfb880854b2e30c840d5" + integrity sha512-2OpS9ArZSuUu9vg2Y5DdK7r1iB1Bjx9e+6qerPGry8um+jI+EsHJESylw5OUrR2DxvtW3Ilrk4YvYpQPa9OB4w== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/rpc-core" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/util" "^9.5.1" + rxjs "^7.5.5" + +"@polkadot/api-derive@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-8.9.1.tgz#d701c98db27b86dceac6d3e737f0cab4f9731045" + integrity sha512-zOuNK1tApg3iEC5N4yiOTaMKUykk4tkNU1htcnotOxflgdhYUi22l0JuCrEtrnG6TE2ZH8z1VQA/jK0MbLfC3A== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/api" "8.9.1" + "@polkadot/api-augment" "8.9.1" + "@polkadot/api-base" "8.9.1" + "@polkadot/rpc-core" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/util" "^9.5.1" + "@polkadot/util-crypto" "^9.5.1" + rxjs "^7.5.5" + +"@polkadot/api@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-8.9.1.tgz#c35c5d583845a5d67edfa8c3579bad143f65bcd6" + integrity sha512-UwQ5hWPHruqnBO2hriaPhGaOwaWZx9MVECWFJzVs0ZuhKDge9jyBp+JXud/Ly/+8VbeokYUB0DSZG/gTAO5+vg== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/api-augment" "8.9.1" + "@polkadot/api-base" "8.9.1" + "@polkadot/api-derive" "8.9.1" + "@polkadot/keyring" "^9.5.1" + "@polkadot/rpc-augment" "8.9.1" + "@polkadot/rpc-core" "8.9.1" + "@polkadot/rpc-provider" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-augment" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/types-create" "8.9.1" + "@polkadot/types-known" "8.9.1" + "@polkadot/util" "^9.5.1" + "@polkadot/util-crypto" "^9.5.1" eventemitter3 "^4.0.7" - rxjs "^7.3.0" - -"@polkadot/keyring@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-7.9.2.tgz#1f5bf6b7bdb5942d275aebf72d4ed98abe874fa8" - integrity sha512-6UGoIxhiTyISkYEZhUbCPpgVxaneIfb/DBVlHtbvaABc8Mqh1KuqcTIq19Mh9wXlBuijl25rw4lUASrE/9sBqg== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/util" "7.9.2" - "@polkadot/util-crypto" "7.9.2" - -"@polkadot/networks@7.9.2", "@polkadot/networks@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-7.9.2.tgz#03e3f3ac6bdea177517436537826055df60bcb9a" - integrity sha512-4obI1RdW5/7TFwbwKA9oqw8aggVZ65JAUvIFMd2YmMC2T4+NiZLnok0WhRkhZkUnqjLIHXYNwq7Ho1i39dte0g== - dependencies: - "@babel/runtime" "^7.16.3" - -"@polkadot/rpc-core@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-5.9.1.tgz#68e2a2ea18c15aa15743e7487a407fdd65d1d900" - integrity sha512-5fXiICAcjp7ow81DnIl2Dq/xuCtJUqyjJkxe9jNHJWBluBxOouqYDb8bYPPGSdckiaVyYe0l8lA9fBUFMdEt6w== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/rpc-provider" "5.9.1" - "@polkadot/types" "5.9.1" - "@polkadot/util" "^7.3.1" - rxjs "^7.3.0" - -"@polkadot/rpc-provider@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-5.9.1.tgz#8e67769c05ba71ecf4f5bc0c5a60eb9afc699167" - integrity sha512-9zamxfnsY7iCswXIK22W0Ji1XHLprm97js3WLw3lP2hr/uSim4Cv4y07zY/z4dDQyF0gJtjKwR27Wo9CZqdr6A== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/types" "5.9.1" - "@polkadot/util" "^7.3.1" - "@polkadot/util-crypto" "^7.3.1" - "@polkadot/x-fetch" "^7.3.1" - "@polkadot/x-global" "^7.3.1" - "@polkadot/x-ws" "^7.3.1" + rxjs "^7.5.5" + +"@polkadot/keyring@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-9.6.2.tgz#8f413b81ed293c7cb5938a85259e4f6381581749" + integrity sha512-xcFx0m01G4jcYqEPJQQqF7Dn62x180G4TXaBR4iOTrjvNwmxx4PgIXN2DodHezb1dJLNSE0lu89OasID/dNNxA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/util" "9.6.2" + "@polkadot/util-crypto" "9.6.2" + +"@polkadot/networks@9.6.2", "@polkadot/networks@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-9.6.2.tgz#0011683682d74d265005b3169023384cd65fb89b" + integrity sha512-zTQkZGRSvgrj/XH1vUz1y1kZOhxT9qUn3T1BfMclbSBdyb+ugI+KLZhYffzfbl1YkQPyrR4MTpueHK40SjGaHg== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/util" "9.6.2" + "@substrate/ss58-registry" "^1.22.0" + +"@polkadot/rpc-augment@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-8.9.1.tgz#644061c68a9a2abe7f3574ab74b10652acae5707" + integrity sha512-6TtZPVjvjcPy3w4lmcNu3MTU1h2YLkZBVNwUZFnZPhALc9qBy9ZcvkMODLPfD+mj+i8Fcfn4b7Ypj+sNqXFxUQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/rpc-core" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/util" "^9.5.1" + +"@polkadot/rpc-core@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-8.9.1.tgz#79392d2a1d1d5e93549cd0f7fae7f0d71a6fb79d" + integrity sha512-+mAkpxIX2kIovnIIf8uxqjXqPA/7LaeysfIPi8VGrVB3IqvLEaT2rWtCMRSFkBEZwYI7vP7PrAw9co6MMkXlUw== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/rpc-augment" "8.9.1" + "@polkadot/rpc-provider" "8.9.1" + "@polkadot/types" "8.9.1" + "@polkadot/util" "^9.5.1" + rxjs "^7.5.5" + +"@polkadot/rpc-provider@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-8.9.1.tgz#1e6e8e6218bb0fe59dd673acb9198bf12acf6625" + integrity sha512-XunL29pi464VB6AJGuvVzTnCtk4y5KBwgBIC/S4YMdqi+l2ujXZOFM2WBnbiV+YhB7FEXmbYR8NsKAe/DSb85A== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/keyring" "^9.5.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-support" "8.9.1" + "@polkadot/util" "^9.5.1" + "@polkadot/util-crypto" "^9.5.1" + "@polkadot/x-fetch" "^9.5.1" + "@polkadot/x-global" "^9.5.1" + "@polkadot/x-ws" "^9.5.1" + "@substrate/connect" "0.7.6" eventemitter3 "^4.0.7" - -"@polkadot/types-known@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-5.9.1.tgz#e52fc7b803bc7cb3f41028f88963deb4ccee40af" - integrity sha512-7lpLuIVGaKziQRzPMnTxyjlYy3spL6WqUg3CcEzmJUKQeUonHglOliQh8JSSz1bcP+YuNHGXK1cKsTjHb+GYxA== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/networks" "^7.3.1" - "@polkadot/types" "5.9.1" - "@polkadot/util" "^7.3.1" - -"@polkadot/types@5.9.1": - version "5.9.1" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-5.9.1.tgz#74cf4695795f2aa365ff85d3873e22c430100bc9" - integrity sha512-30vcSlNBxPyWYZaxKDr/BoMhfLCRKB265XxpnnNJmbdZZsL+N4Zp2mJR9/UbA6ypmJBkUjD7b1s9AYsLwUs+8w== - dependencies: - "@babel/runtime" "^7.15.4" - "@polkadot/util" "^7.3.1" - "@polkadot/util-crypto" "^7.3.1" - rxjs "^7.3.0" - -"@polkadot/util-crypto@7.9.2", "@polkadot/util-crypto@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-7.9.2.tgz#cdc336f92a6bc3d40c5a23734e1974fb777817f0" - integrity sha512-nNwqUwP44eCH9jKKcPie+IHLKkg9LMe6H7hXo91hy3AtoslnNrT51tP3uAm5yllhLvswJfnAgnlHq7ybCgqeFw== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/networks" "7.9.2" - "@polkadot/util" "7.9.2" - "@polkadot/wasm-crypto" "^4.4.1" - "@polkadot/x-randomvalues" "7.9.2" - blakejs "^1.1.1" - bn.js "^4.12.0" - create-hash "^1.2.0" + mock-socket "^9.1.5" + nock "^13.2.6" + +"@polkadot/types-augment@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-8.9.1.tgz#ff4880471eba038f8b28e412b7d8d1f500d46cf9" + integrity sha512-kfSioIpB8krtNgIANN8QCik+uBFmxGACEq84oxiqbKc2BfTXzcqQ7jkmslXeEqb9IsQ9rpaa3fkvyoLQNLqXgA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/types" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/util" "^9.5.1" + +"@polkadot/types-codec@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-8.9.1.tgz#8fbf3ade7a87b716937b7f37fd43b8a46ba12c4d" + integrity sha512-bboHpTwvHooTdITsmJ5IqAyZDuONZaVs6xC3iRbE9SIHD4kUpivlTc+Rvk91EcQclFo5IUKvNrX4BrOx8Y/YnQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/util" "^9.5.1" + +"@polkadot/types-create@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-8.9.1.tgz#ed365812b522fcc7984aa24cf7cbeeb0cdf20e34" + integrity sha512-q7er671QXYcmG4gkZvtKpES7QV013w36s8VT947aT3GDzlGZDQQKNKpELyi7K1sgWjQyrL3/0cTKhP8taAjWPQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/types-codec" "8.9.1" + "@polkadot/util" "^9.5.1" + +"@polkadot/types-known@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-8.9.1.tgz#019ab25b048f157659cf6141c3d8483c28af0123" + integrity sha512-y5Fvo7TM9DjM/CNQbQsR78O5LP3CuBbQY90yA2APwqZNn/dilTxWIGrxtPzTG9QCZJyhMN+EZdKUo51brKRI/g== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/networks" "^9.5.1" + "@polkadot/types" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/types-create" "8.9.1" + "@polkadot/util" "^9.5.1" + +"@polkadot/types-support@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-8.9.1.tgz#84d023945feddc15f60b8cb1a36abe2edfed4a23" + integrity sha512-t3HJc8o68LWvhEy63PRZQxCL4T7sSsrLm7+rpkfeJAEC1DXeFF85FwE2U+YKa3+Z3NuMv2e4DV2jnIZe9XRtHQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/util" "^9.5.1" + +"@polkadot/types@8.9.1": + version "8.9.1" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-8.9.1.tgz#e5bf1cef79d8c305faa8691c62dd3d4be9baed53" + integrity sha512-h43/aPzk+ta0MzzGQz3DiGtearttHxZr08xOdtU5GctI6u9MXm0n0w74clciLpIGu5CI+QxYN3oQ8/5WXTukMw== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/keyring" "^9.5.1" + "@polkadot/types-augment" "8.9.1" + "@polkadot/types-codec" "8.9.1" + "@polkadot/types-create" "8.9.1" + "@polkadot/util" "^9.5.1" + "@polkadot/util-crypto" "^9.5.1" + rxjs "^7.5.5" + +"@polkadot/util-crypto@9.6.2", "@polkadot/util-crypto@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-9.6.2.tgz#643d6118df8f4a6873855522166c47a76eb2aec1" + integrity sha512-ptr4RnVevjW5Sel3JjLJUaT1YmG04zeof4hddJJuQ/H8S/WIkv4uRgT9lkjw54U/DB+qS44XO/uIGMlR7BtLQg== + dependencies: + "@babel/runtime" "^7.18.3" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.0" + "@polkadot/networks" "9.6.2" + "@polkadot/util" "9.6.2" + "@polkadot/wasm-crypto" "^6.1.5" + "@polkadot/x-bigint" "9.6.2" + "@polkadot/x-randomvalues" "9.6.2" + "@scure/base" "1.1.1" ed2curve "^0.3.0" - elliptic "^6.5.4" - hash.js "^1.1.7" - js-sha3 "^0.8.0" - micro-base "^0.9.0" - scryptsy "^2.1.0" tweetnacl "^1.0.3" - xxhashjs "^0.2.2" -"@polkadot/util@7.9.2", "@polkadot/util@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-7.9.2.tgz#567ac659516d6b685ed7e796919901d92e5cbe6b" - integrity sha512-6ABY6ErgkCsM4C6+X+AJSY4pBGwbKlHZmUtHftaiTvbaj4XuA4nTo3GU28jw8wY0Jh2cJZJvt6/BJ5GVkm5tBA== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-textdecoder" "7.9.2" - "@polkadot/x-textencoder" "7.9.2" - "@types/bn.js" "^4.11.6" - bn.js "^4.12.0" - camelcase "^6.2.1" +"@polkadot/util@9.6.2", "@polkadot/util@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-9.6.2.tgz#ad011b04f941bf7ce62babfd8ea32180ed985caf" + integrity sha512-ebK46kEsXfzqUgaPVbVOZepHtVJR2qd9FHTLBPcoXR601y6IuqCHkp0hMkrD3Cdi5AWAd0a7h84c1/Oj5q3SnA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-bigint" "9.6.2" + "@polkadot/x-global" "9.6.2" + "@polkadot/x-textdecoder" "9.6.2" + "@polkadot/x-textencoder" "9.6.2" + "@types/bn.js" "^5.1.0" + bn.js "^5.2.1" ip-regex "^4.3.0" -"@polkadot/wasm-crypto-asmjs@^4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.5.1.tgz#e1025a49e106db11d1187caf65f56c960ea2ad2b" - integrity sha512-DOdRiWhxVvmqTvp+E9z1j+Yr0zDOGsDvqnT/eNw0Dl1FVUOImsEa7FKns/urASmcxCVEE1jtUWSnij29jrORMQ== +"@polkadot/wasm-bridge@6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-bridge/-/wasm-bridge-6.1.5.tgz#f77e3605eb30ac199a8d3a6357affb35f81f983a" + integrity sha512-nqxhJQTjw5P3yEY1Cd9g86GvpY/PHD3h74dszaBOg5GVPE53G18AKehb5I8daSpOHVKsItKK1n8xstxZTVI0Hg== dependencies: - "@babel/runtime" "^7.16.3" - -"@polkadot/wasm-crypto-wasm@^4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.5.1.tgz#063a58ff7ddd939b7886a6a238109a8d2c416e46" - integrity sha512-hPwke85HxpgG/RAlwdCE8u5w7bThvWg399mlB+XjogXMxOUWBZSgq2XYbgzROUXx27inK9nStF4Pnc4zJnqs9A== - dependencies: - "@babel/runtime" "^7.16.3" - -"@polkadot/wasm-crypto@^4.4.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.5.1.tgz#e1ac6d846a0ad8e991cec128994524183ef6e8fd" - integrity sha512-Cr21ais3Kq3aedIHZ3J1tjgeD/+K8FCiwEawr0oRywNBSJR8wyuZMePs4swR/6xm8wbBkpqoBVHz/UQHqqQJmA== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/wasm-crypto-asmjs" "^4.5.1" - "@polkadot/wasm-crypto-wasm" "^4.5.1" - -"@polkadot/x-fetch@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-7.9.2.tgz#fe943be5854f7355630388b1b5d2bb52f1a3afb2" - integrity sha512-zutLkFJVaLVpY3cIGYJD0AReLfAnPr2J82Ca4pvy/BxqwwGYuGLcn36A4m6nliGBP2lcH4oYY+mcCqIwoPWQUQ== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-global" "7.9.2" - "@types/node-fetch" "^2.5.12" - node-fetch "^2.6.6" - -"@polkadot/x-global@7.9.2", "@polkadot/x-global@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-7.9.2.tgz#b272b0a3bedaad3bcbf075ec4682abe68cf2a850" - integrity sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A== - dependencies: - "@babel/runtime" "^7.16.3" - -"@polkadot/x-randomvalues@7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-7.9.2.tgz#0c9bb7b48a0791c2a32e9605a31a5ce56fee621d" - integrity sha512-svQfG31yCXf6yVyIgP0NgCzEy7oc3Lw054ZspkaqjOivxYdrXaf5w3JSSUyM/MRjI2+nk+B/EyJoMYcfSwTfsQ== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-global" "7.9.2" - -"@polkadot/x-textdecoder@7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-7.9.2.tgz#a78548e33efeb3a25f761fec9787b2bcae7f0608" - integrity sha512-wfwbSHXPhrOAl12QvlIOGNkMH/N/h8PId2ytIjvM/8zPPFB5Il6DWSFLtVapOGEpIFjEWbd5t8Td4pHBVXIEbg== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-global" "7.9.2" - -"@polkadot/x-textencoder@7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-7.9.2.tgz#b32bfd6fbff8587c56452f58252a52d62bbcd5b9" - integrity sha512-A19wwYINuZwU2dUyQ/mMzB0ISjyfc4cISfL4zCMUAVgj7xVoXMYV2GfjNdMpA8Wsjch3su6pxLbtJ2wU03sRTQ== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-global" "7.9.2" - -"@polkadot/x-ws@^7.3.1": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-7.9.2.tgz#016df26fa829b74f8b1e31a1dcd6e34256c1231f" - integrity sha512-+yppMsZtvDztVOSmkqAQuhR6TfV1Axa6ergAsWb52DrfXvFP5geqtARsI6ZdDgMsE3qHSVQTcJz8vgNOr5+ztQ== - dependencies: - "@babel/runtime" "^7.16.3" - "@polkadot/x-global" "7.9.2" - "@types/websocket" "^1.0.4" + "@babel/runtime" "^7.18.3" + +"@polkadot/wasm-crypto-asmjs@6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-6.1.5.tgz#2446159502fc3966cdcc4a9560494e037bdec3ab" + integrity sha512-GsVIe+fjJ2sHfrjtqSLV0tP6nClF/7/QXZd+BAWomVMCVcR35OIrkNK2giDzlCqaTP+MiCb/UF3phrU4wsHV4Q== + dependencies: + "@babel/runtime" "^7.18.3" + +"@polkadot/wasm-crypto-init@6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-init/-/wasm-crypto-init-6.1.5.tgz#86756bc85bffced837778c2c2d35dab69adfb8f5" + integrity sha512-VkBNc4cEkQ9YWAKLGW2ve2HV56GBHii3Xy4QYV+8OFYiOUbBMDVmuAvjlCjxiwa8nUxLzgCIz0HqqUx2YzxkhQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/wasm-bridge" "6.1.5" + "@polkadot/wasm-crypto-asmjs" "6.1.5" + "@polkadot/wasm-crypto-wasm" "6.1.5" + +"@polkadot/wasm-crypto-wasm@6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-6.1.5.tgz#1a694958b8aedf1908d0abf4d30a95e68219cef8" + integrity sha512-YKriV8xUnnNVCykB0c1r0JEQgGPmgPMsEfHLzKhUeE415vkj3UcfcgXuOXVSEXKqgeoCLkvlY5OL3yb3Fg+Xbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/wasm-util" "6.1.5" + +"@polkadot/wasm-crypto@^6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-6.1.5.tgz#a7f60ebf81297a460fa1e97f71c4db6c91d49639" + integrity sha512-P4MIVE0RJm+Ar0qbOFFtEvA9fkrcmu4KI929k/XiWOqqKuLogwNjZcZiWZYLG7pDIXeHciAy65nIUpV2nr0D+Q== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/wasm-bridge" "6.1.5" + "@polkadot/wasm-crypto-asmjs" "6.1.5" + "@polkadot/wasm-crypto-init" "6.1.5" + "@polkadot/wasm-crypto-wasm" "6.1.5" + "@polkadot/wasm-util" "6.1.5" + +"@polkadot/wasm-util@6.1.5": + version "6.1.5" + resolved "https://registry.yarnpkg.com/@polkadot/wasm-util/-/wasm-util-6.1.5.tgz#4dcd4a32d706e18a40c2de65813abad1b4cbf730" + integrity sha512-5OH31mz8/Ly50fNOQ6eGFcO8OtLLyTvaoJPqUmcdl6OI+1+8GLoZMoXyRdrhWjftqQFxiJnwvlpqq6VdNVDg6g== + dependencies: + "@babel/runtime" "^7.18.3" + +"@polkadot/x-bigint@9.6.2": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-9.6.2.tgz#1fa6038395fd488b7c0051113813de9a645a208b" + integrity sha512-p2PAx5uJM4zGhbDCEMiFbeOndP8bnzdEdvB4aP17o4AQ8iHM/TrhiOMD7xYeUtMpc0TP+Z6X0ZRqsAt4jBzoRg== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + +"@polkadot/x-fetch@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-9.6.2.tgz#709019626a5618805516bbdd3701e26781b3e849" + integrity sha512-nTZOzpmgj+f5KxRcZxValpgnAc2xxefY84XaF3XKcQQBfQrN+/Kssfl5VjAoCGfBSpVVzXs/4/cN0oee5BldMQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + "@types/node-fetch" "^2.6.2" + node-fetch "^2.6.7" + +"@polkadot/x-global@9.6.2", "@polkadot/x-global@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-9.6.2.tgz#caf4a140fe9902a2649c029db43b5424b85cdde8" + integrity sha512-cbrNeMK6vPEWh2EbLU+hUOERkOAToZ7o2wYYS+ZNdunvUFL9wERB9Uj6JQDAebGD3ZCNHEpMbj6U1WEffiwq9A== + dependencies: + "@babel/runtime" "^7.18.3" + +"@polkadot/x-randomvalues@9.6.2": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-9.6.2.tgz#8555710235f649c14ea28c25919bed6c0e4202bb" + integrity sha512-GuyTYTkKK6MLPcfWX3rKRze3nUYjdRYWK1PKscslRp0Qq4LBTkroqlE7SMTt8Bh7DYH+0fWN2CmHGdv2oEUq9A== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + +"@polkadot/x-textdecoder@9.6.2": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-9.6.2.tgz#d2e10e96ce2c89fcb3f020bea09e2943dc55a11a" + integrity sha512-nWd2sWU7vjUON4FSd6B2aSYmgkooYf1V+kjTPs8uV/PN6KMc6qJInrt4U1vnOvM8wX5+4gvLDs72AVxnFmVRAA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + +"@polkadot/x-textencoder@9.6.2": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-9.6.2.tgz#e0d3c37094bc19dd55ee3f0659a5a6b69ef43b91" + integrity sha512-T+ZsR2cVJxmpN6VB4u3BoWCg3fUlXHPNGCZSGXZdH2+dljIQl6MXqe+mHd5jknGvyBWCrJ0ijqoSOtLeP88MhA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + +"@polkadot/x-ws@^9.5.1": + version "9.6.2" + resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-9.6.2.tgz#ad6ba74968a3714647c1eaefdd2af9196e0df54c" + integrity sha512-DT10DqFzM2PGe+0tmClgF5G7biM/akVpAQ9JGIdwV8PxWFWjxbhRasndPfVZEmCi2o8KIVlP6m1qovfS2PdbHA== + dependencies: + "@babel/runtime" "^7.18.3" + "@polkadot/x-global" "9.6.2" + "@types/websocket" "^1.0.5" websocket "^1.0.34" "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": @@ -864,11 +996,44 @@ dependencies: any-observable "^0.3.0" +"@scure/base@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + "@sqltools/formatter@^1.2.2": version "1.2.3" resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== +"@substrate/connect-extension-protocol@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.0.tgz#d452beda84b3ebfcf0e88592a4695e729a91e858" + integrity sha512-nFVuKdp71hMd/MGlllAOh+a2hAqt8m6J2G0aSsS/RcALZexxF9jodbFc62ni8RDtJboeOfXAHhenYOANvJKPIg== + +"@substrate/connect@0.7.6": + version "0.7.6" + resolved "https://registry.yarnpkg.com/@substrate/connect/-/connect-0.7.6.tgz#4b1cca6bf9c0e8be93f6f6a4eeb6684993f5dc18" + integrity sha512-PHizR91CbjC5bzUwgYUZJrbOyoraCS1QqoxkFHteZ/0vkXDKyuzoixobDaITJqq6wSTeM8ZSjuOn9u/3q7F5+A== + dependencies: + "@substrate/connect-extension-protocol" "^1.0.0" + "@substrate/smoldot-light" "0.6.19" + eventemitter3 "^4.0.7" + +"@substrate/smoldot-light@0.6.19": + version "0.6.19" + resolved "https://registry.yarnpkg.com/@substrate/smoldot-light/-/smoldot-light-0.6.19.tgz#13e897ca9839aecb0dac4ce079ff1cca1dc54cc0" + integrity sha512-Xi+v1cdURhTwx7NH+9fa1U9m7VGP61GvB6qwev9HrZXlGbQiUIvySxPlH/LMsq3mwgiRYkokPhcaZEHufY7Urg== + dependencies: + buffer "^6.0.1" + pako "^2.0.4" + websocket "^1.0.32" + +"@substrate/ss58-registry@^1.22.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@substrate/ss58-registry/-/ss58-registry-1.23.0.tgz#6212bf871a882da98799f8dc51de0944d4152b88" + integrity sha512-LuQje7n48GXSsp1aGI6UEmNVtlh7OzQ6CN1Hd9VGUrshADwMB0lRZ5bxnffmqDR4vVugI7h0NN0AONhIW1eHGg== + "@types/accepts@*", "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -881,10 +1046,10 @@ resolved "https://registry.yarnpkg.com/@types/app-root-path/-/app-root-path-1.2.4.tgz#a78b703282b32ac54de768f5512ecc3569919dc7" integrity sha1-p4twMoKzKsVN52j1US7MNWmRncc= -"@types/bn.js@^4.11.6": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== +"@types/bn.js@^4.11.6", "@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== dependencies: "@types/node" "*" @@ -1002,35 +1167,21 @@ dependencies: "@types/node" "*" -"@types/glob@^7.1.1": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== +"@types/glob@^7.1.3": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" -"@types/graphql-fields@^1.3.2": +"@types/graphql-fields@^1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@types/graphql-fields/-/graphql-fields-1.3.4.tgz#868ffe444ba8027ea1eccb0909f9c331d1bd620a" integrity sha512-McLJaAaqY7lk9d9y7E61iQrj0AwcEjSb8uHlPh7KgYV+XX1MSLlSt/alhd5k2BPRE8gy/f4lnkLGb5ke3iG66Q== dependencies: graphql "^15.3.0" -"@types/graphql-iso-date@^3.3.3": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@types/graphql-iso-date/-/graphql-iso-date-3.4.0.tgz#b6710b21e3b0bfdb1a0529b285148d98eac18b1f" - integrity sha512-V3jITHTsoI2E8TGt9+/HPDz6LWt3z9/HYnPJYWI6WwiLRexsngg7KzaQlCgQkA4jkEbGPROUD0hJFc9F02W9WA== - dependencies: - graphql "^15.1.0" - -"@types/graphql-type-json@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@types/graphql-type-json/-/graphql-type-json-0.3.2.tgz#1a7105e6546fc1630a5db4834bfbc0eb554986e4" - integrity sha512-c1cq4o8EhY0Z39ua8UXwG8uBs23xBYA/Uw0tXFl6SuTUpkVv/IJqf6pHQbfdC7nwFRhX2ifTOV/UIg0Q/IJsbg== - dependencies: - graphql "^14.5.3" - "@types/graphql@^14.5.0": version "14.5.0" resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.5.0.tgz#a545fb3bc8013a3547cf2f07f5e13a33642b75d6" @@ -1142,10 +1293,10 @@ resolved "https://registry.yarnpkg.com/@types/node-emoji/-/node-emoji-1.8.1.tgz#689cb74fdf6e84309bcafce93a135dfecd01de3f" integrity sha512-0fRfA90FWm6KJfw6P9QGyo0HDTCmthZ7cWaBQndITlaWLTZ6njRyKwrwpzpg+n6kBXBIGKeUHEQuBx7bphGJkA== -"@types/node-fetch@^2.5.12": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== +"@types/node-fetch@^2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" @@ -1160,11 +1311,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.30", "@types/node@^12.12.8", "@types/node@^12.6.2": +"@types/node@^12.12.30", "@types/node@^12.12.8": version "12.20.28" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.28.tgz#4b20048c6052b5f51a8d5e0d2acbf63d5a17e1e2" integrity sha512-cBw8gzxUPYX+/5lugXIPksioBSbE42k0fZ39p+4yRzfYjN6++eq9kAPdlY9qm+MXyfbk9EmvCYAYRn380sF46w== +"@types/node@^14.11.2": + version "14.18.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6" + integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== + "@types/open@^6.2.1": version "6.2.1" resolved "https://registry.yarnpkg.com/@types/open/-/open-6.2.1.tgz#3797ccbe876cca4b0bc78bdfbc3a3008110fdb13" @@ -1186,10 +1342,10 @@ pg-protocol "^1.2.0" pg-types "^2.2.0" -"@types/prettier@^1.18.3": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" - integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== +"@types/prettier@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" + integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== "@types/prop-types@*": version "15.7.4" @@ -1230,10 +1386,10 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -"@types/semver@^6.0.1": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" - integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== +"@types/semver@^7.3.3": + version "7.3.10" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" + integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw== "@types/serve-static@*": version "1.13.10" @@ -1253,15 +1409,10 @@ resolved "https://registry.yarnpkg.com/@types/validator/-/validator-10.11.3.tgz#945799bef24a953c5bc02011ca8ad79331a3ef25" integrity sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w== -"@types/validator@^13.1.3": - version "13.6.3" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.6.3.tgz#31ca2e997bf13a0fffca30a25747d5b9f7dbb7de" - integrity sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw== - -"@types/websocket@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8" - integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA== +"@types/websocket@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c" + integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ== dependencies: "@types/node" "*" @@ -1279,11 +1430,6 @@ dependencies: "@types/node" "*" -"@types/zen-observable@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== - "@wry/equality@^0.1.2": version "0.1.11" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" @@ -1699,22 +1845,12 @@ bfj@^6.1.1: hoopy "^0.1.4" tryer "^1.0.1" -blakejs@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" - integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== - bluebird@^3.3.5, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.11.9, bn.js@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.0: +bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -1757,11 +1893,6 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - browser-fingerprint@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/browser-fingerprint/-/browser-fingerprint-0.0.1.tgz#8df3cdca25bf7d5b3542d61545d730053fce604a" @@ -1777,7 +1908,7 @@ buffer-writer@2.0.0: resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== -buffer@^6.0.3: +buffer@^6.0.1, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1837,11 +1968,6 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -1863,7 +1989,7 @@ chalk@*, chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -1903,28 +2029,11 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -cipher-base@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - class-transformer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.2.3.tgz#598c92ca71dcca73f91ccb875d74a3847ccfa32d" integrity sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ== -class-validator@>=0.9.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.1.tgz#381b2001ee6b9e05afd133671fbdf760da7dec67" - integrity sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg== - dependencies: - "@types/validator" "^13.1.3" - libphonenumber-js "^1.9.7" - validator "^13.5.2" - class-validator@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.11.1.tgz#9033b9ebdc3883e826dfc0c545a45935e3298553" @@ -2241,17 +2350,6 @@ cosmiconfig@6.0.0, cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - create-react-class@^15.5.1: version "15.7.0" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e" @@ -2327,11 +2425,6 @@ cuid@^1.3.8: core-js "^1.1.1" node-fingerprint "0.0.2" -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= - d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -2350,6 +2443,11 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-fns@^2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2364,6 +2462,13 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2457,10 +2562,10 @@ dotenv@*: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dotenv@^16.0.0: + version "16.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d" + integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ== duplexer@^0.1.1: version "0.1.2" @@ -2489,19 +2594,6 @@ elegant-spinner@^1.0.1: resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= -elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -2786,7 +2878,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -figlet@^1.1.1: +figlet@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.2.tgz#dda34ff233c9a48e36fcff6741aeb5bafe49b634" integrity sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ== @@ -2974,7 +3066,7 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -2986,6 +3078,18 @@ glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3138,10 +3242,10 @@ graphql-language-service-utils@^2.5.1: graphql-language-service-types "^1.8.0" nullthrows "^1.0.0" -graphql-query-complexity@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/graphql-query-complexity/-/graphql-query-complexity-0.3.0.tgz#71a44e124b7591a185d9d8cde55205aa57680c5d" - integrity sha512-JVqHT81Eh9O17iOjs1r1qzsh5YY2upfA3zoUsQGggT4d+1hajWitk4GQQY5SZtq5eul7y6jMsM9qRUSOAKhDJQ== +graphql-query-complexity@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/graphql-query-complexity/-/graphql-query-complexity-0.7.2.tgz#7fc6bb20930ab1b666ecf3bbfb24b65b6f08ecc4" + integrity sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ== dependencies: lodash.get "^4.4.2" @@ -3184,7 +3288,7 @@ graphql-tools@4.0.5: iterall "^1.1.3" uuid "^3.1.0" -graphql-tools@^4.0.6, graphql-tools@^4.0.8: +graphql-tools@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz#e7fb9f0d43408fb0878ba66b522ce871bafe9d30" integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== @@ -3200,18 +3304,23 @@ graphql-type-json@^0.3.0: resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== -graphql@*, graphql@^15.0.0, graphql@^15.1.0, graphql@^15.3.0: +graphql@*, graphql@^15.0.0, graphql@^15.3.0: version "15.6.1" resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.6.1.tgz#9125bdf057553525da251e19e96dab3d3855ddfc" integrity sha512-3i5lu0z6dRvJ48QP9kFxBkJ7h4Kso7PS8eahyTFz5Jm6CvQfLtNIE8LX9N6JLnXTuwR+sIYnXzaWp6anOg0QQw== -"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0", graphql@^14.5.3, graphql@^14.5.8: +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0": version "14.7.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA== dependencies: iterall "^1.2.2" +graphql@^15.8.0: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + gzip-size@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -3273,23 +3382,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -3307,15 +3399,6 @@ history@^4.7.2: tiny-warning "^1.0.0" value-equal "^1.0.1" -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hoek@6.x.x: version "6.1.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" @@ -3453,7 +3536,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3722,11 +3805,6 @@ iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3740,7 +3818,7 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.0.0: +js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -3769,6 +3847,11 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -3822,11 +3905,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libphonenumber-js@^1.9.7: - version "1.9.37" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.37.tgz#944f59a3618a8f85d9b619767a0b6fb87523f285" - integrity sha512-RnUR4XwiVhMLnT7uFSdnmLeprspquuDtaShAgKTA+g/ms9/S4hQU3/QpFdh3iXPHtxD52QscXLm2W2+QBmvYAg== - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -4136,15 +4214,6 @@ marked@^0.8.2: resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -4196,11 +4265,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micro-base@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/micro-base/-/micro-base-0.9.0.tgz#09cfe20285bec0ea97f41dc3d10e3fba3d0266ee" - integrity sha512-4+tOMKidYT5nQ6/UNmYrGVO5PMcnJdfuR4NC8HK8s2H61B4itOhA9yrsjBdqGV7ecdtej36x3YSIfPLRmPrspg== - micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -4236,16 +4300,6 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4253,6 +4307,13 @@ minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -4270,6 +4331,11 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mock-socket@^9.1.5: + version "9.1.5" + resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.1.5.tgz#2c4e44922ad556843b6dfe09d14ed8041fa2cdeb" + integrity sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4334,6 +4400,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nock@^13.2.6: + version "13.2.7" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.2.7.tgz#c93933b61df42f4f4b3a07fde946a4e209c0c168" + integrity sha512-R6NUw7RIPtKwgK7jskuKoEi4VFMqIHtV2Uu9K/Uegc4TA5cqe+oNMYslZcUmnVNQCTG6wcSqUBaGTDd7sq5srg== + dependencies: + debug "^4.1.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.21" + propagate "^2.0.0" + node-emoji@^1.10.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -4361,10 +4437,10 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.6: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" @@ -4612,6 +4688,11 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== +pako@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4619,11 +4700,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parent-require@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" - integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -4862,15 +4938,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.2.tgz#1ba8f3eb92231e769b7fcd7cb73ae1b6b74ade08" - integrity sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg== - -prettier@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== process-nextick-args@~2.0.0: version "2.0.1" @@ -4886,6 +4957,11 @@ prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.8.1" +propagate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" + integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5143,7 +5219,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^3.0.0, readable-stream@^3.6.0: +readable-stream@^3.0.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -5327,14 +5403,6 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" -ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - run-async@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -5354,10 +5422,10 @@ rxjs@^6.3.3, rxjs@^6.5.1: dependencies: tslib "^1.9.0" -rxjs@^7.3.0: - version "7.5.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157" - integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ== +rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: tslib "^2.1.0" @@ -5366,7 +5434,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5389,11 +5457,6 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - seamless-immutable@^7.0.1: version "7.1.4" resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.4.tgz#6e9536def083ddc4dea0207d722e0e80d0f372f8" @@ -5404,11 +5467,6 @@ seamless-immutable@^7.0.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - semver@^7.0.0, semver@^7.3.2: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -5460,7 +5518,7 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.11: +sha.js@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== @@ -5630,7 +5688,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5922,6 +5980,11 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@~2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.0.1, tslib@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -5951,20 +6014,19 @@ type-fest@^0.3.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== -type-graphql@^0.17.5: - version "0.17.6" - resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-0.17.6.tgz#2a939df607f7ca2924986fd0c0b8c753835d7d01" - integrity sha512-UFZaMMnpae3zeu9qCdWN82hm8wQeYu/+sQFbG5v3vlTtctZ9Xle9bvNi/rzSbQaG94K9Y5O5AGxjVKKMpEAMYA== - dependencies: - "@types/glob" "^7.1.1" - "@types/node" "^12.6.2" - "@types/semver" "^6.0.1" - class-validator ">=0.9.1" - glob "^7.1.4" - graphql-query-complexity "^0.3.0" +type-graphql@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-1.1.1.tgz#dc0710d961713b92d3fee927981fa43bf71667a4" + integrity sha512-iOOWVn0ehCYMukmnXStbkRwFE9dcjt7/oDcBS1JyQZo9CbhlIll4lHHps54HMEk4A4c8bUPd+DjK8w1/ZrxB4A== + dependencies: + "@types/glob" "^7.1.3" + "@types/node" "^14.11.2" + "@types/semver" "^7.3.3" + glob "^7.1.6" + graphql-query-complexity "^0.7.0" graphql-subscriptions "^1.1.0" - semver "^6.2.0" - tslib "^1.10.0" + semver "^7.3.2" + tslib "^2.0.1" type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -6001,28 +6063,27 @@ typeorm-typedi-extensions@^0.4.1: resolved "https://registry.yarnpkg.com/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.4.1.tgz#e62e3c8f30021c9b8f258e068d38723dbd64de1d" integrity sha512-05hWktQ4zuXzTTUO3ao56yOezlvUuZhH2NRS//m0SOGCAJoVlfPTMHcmDaMSQy/lMfAwPWoIyn+sfK7ONzTdXQ== -typeorm@0.2.37: - version "0.2.37" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.37.tgz#1a5e59216077640694d27c04c99ed3f968d15dc8" - integrity sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw== +"typeorm@https://github.com/Joystream/typeorm/releases/download/0.3.5/typeorm-v0.3.5.tgz": + version "0.3.5" + resolved "https://github.com/Joystream/typeorm/releases/download/0.3.5/typeorm-v0.3.5.tgz#a9fd8a8b1947ed5616707327853a81bded1e023d" dependencies: "@sqltools/formatter" "^1.2.2" app-root-path "^3.0.0" buffer "^6.0.3" chalk "^4.1.0" cli-highlight "^2.1.11" - debug "^4.3.1" - dotenv "^8.2.0" - glob "^7.1.6" - js-yaml "^4.0.0" + date-fns "^2.28.0" + debug "^4.3.3" + dotenv "^16.0.0" + glob "^7.2.0" + js-yaml "^4.1.0" mkdirp "^1.0.4" reflect-metadata "^0.1.13" sha.js "^2.4.11" - tslib "^2.1.0" + tslib "^2.3.1" + uuid "^8.3.2" xml2js "^0.4.23" - yargonaut "^1.1.4" - yargs "^17.0.1" - zen-observable-ts "^1.0.0" + yargs "^17.3.1" typescript-compare@^0.0.2: version "0.0.2" @@ -6131,7 +6192,7 @@ uuid@^3.1.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0: +uuid@^8.0.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -6149,11 +6210,6 @@ validator@12.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-12.0.0.tgz#fb33221f5320abe2422cda2f517dc3838064e813" integrity sha512-r5zA1cQBEOgYlesRmSEwc9LkbfNLTtji+vWyaHzRZUxCTHdsX3bd+sdHfs5tGZ2W6ILGGsxWxCNwT/h3IY/3ng== -validator@^13.5.2: - version "13.6.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" - integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== - value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -6207,7 +6263,7 @@ webpack-bundle-analyzer@^3.3.2: opener "^1.5.1" ws "^6.0.0" -websocket@^1.0.34: +websocket@^1.0.32, websocket@^1.0.34: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== @@ -6378,13 +6434,6 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -xxhashjs@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" - integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== - dependencies: - cuint "^0.2.2" - y18n@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" @@ -6424,15 +6473,6 @@ yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargonaut@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" - integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== - dependencies: - chalk "^1.1.1" - figlet "^1.1.1" - parent-require "^1.0.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -6454,6 +6494,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + yargs-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" @@ -6493,18 +6538,18 @@ yargs@^16.0.0, yargs@^16.1.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" - integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== +yargs@^17.3.1: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== dependencies: cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.0.0" yargs@^5.0.0: version "5.0.0" @@ -6544,20 +6589,12 @@ zen-observable-ts@^0.8.21: tslib "^1.9.3" zen-observable "^0.8.0" -zen-observable-ts@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" - integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== - dependencies: - "@types/zen-observable" "0.8.3" - zen-observable "0.8.15" - -zen-observable@0.8.15, zen-observable@^0.8.0: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - zen-observable@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.7.1.tgz#f84075c0ee085594d3566e1d6454207f126411b3" integrity sha512-OI6VMSe0yeqaouIXtedC+F55Sr6r9ppS7+wTbSexkYdHbdt4ctTuPNXP/rwm7GTVI63YBc+EBT0b0tl7YnJLRg== + +zen-observable@^0.8.0: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/query-node/manifest.yml b/query-node/manifest.yml index b4dc7cad08..bdaddd3388 100644 --- a/query-node/manifest.yml +++ b/query-node/manifest.yml @@ -1,7 +1,7 @@ -version: '3.0' -description: Joystream query-node manifest file for Olympia +version: '4.0' +description: Joystream query-node manifest file repository: https://github.com/Joystream/joystream -hydraVersion: "3" +hydraVersion: '4' dataSource: kind: substrate chain: joystream @@ -13,6 +13,8 @@ typegen: events: # Membership - members.MembershipBought + - members.MembershipGifted + - members.MemberCreated - members.MemberProfileUpdated - members.MemberAccountsUpdated - members.MemberVerificationStatusUpdated @@ -26,6 +28,7 @@ typegen: - members.ReferralCutUpdated - members.InitialInvitationBalanceUpdated - members.LeaderInvitationQuotaUpdated + - members.MemberRemarked # Working groups - use Storage Working Group as a reference group (all groups emit the same events) - storageWorkingGroup.OpeningAdded - storageWorkingGroup.AppliedOnOpening @@ -49,6 +52,7 @@ typegen: - storageWorkingGroup.BudgetSpending - storageWorkingGroup.RewardPaid - storageWorkingGroup.NewMissedRewardLevelReached + - storageWorkingGroup.LeadRemarked # Proposals - proposalsCodex.ProposalCreated - proposalsEngine.ProposalStatusUpdated @@ -71,12 +75,10 @@ typegen: - forum.ThreadMetadataUpdated - forum.ThreadDeleted - forum.ThreadMoved - - forum.VoteOnPoll - forum.PostAdded - forum.PostModerated - forum.PostDeleted - forum.PostTextUpdated - - forum.PostReacted - forum.CategoryStickyThreadUpdate - forum.CategoryMembershipOfModeratorUpdated # Content directory @@ -87,38 +89,33 @@ typegen: - content.ChannelCreated - content.ChannelUpdated - content.ChannelAssetsRemoved - - content.ChannelCensorshipStatusUpdated - - content.ChannelCategoryCreated - - content.ChannelCategoryUpdated - - content.ChannelCategoryDeleted - - content.VideoCategoryCreated - - content.VideoCategoryUpdated - - content.VideoCategoryDeleted - content.VideoCreated - content.VideoUpdated - content.VideoDeleted - - content.VideoCensorshipStatusUpdated - - content.FeaturedVideosSet - content.ChannelDeleted + - content.ChannelDeletedByModerator + - content.VideoDeletedByModerator + - content.ChannelAssetsDeletedByModerator + - content.VideoAssetsDeletedByModerator + - content.VideoVisibilitySetByModerator + - content.ChannelVisibilitySetByModerator + - content.ChannelOwnerRemarked + - content.ChannelAgentRemarked # Storage - storage.StorageBucketCreated - storage.StorageBucketInvitationAccepted - storage.StorageBucketsUpdatedForBag - storage.DataObjectsUploaded + - storage.DataObjectsUpdated - storage.StorageOperatorMetadataSet - storage.StorageBucketVoucherLimitsSet - storage.PendingDataObjectsAccepted - storage.StorageBucketInvitationCancelled - storage.StorageBucketOperatorInvited - storage.StorageBucketOperatorRemoved - - storage.UploadingBlockStatusUpdated - - storage.DataObjectPerMegabyteFeeUpdated - - storage.StorageBucketsPerBagLimitUpdated - - storage.StorageBucketsVoucherMaxLimitsUpdated - storage.DataObjectsMoved - storage.DataObjectsDeleted - storage.StorageBucketStatusUpdated - - storage.UpdateBlacklist - storage.DynamicBagDeleted - storage.DynamicBagCreated - storage.VoucherChanged @@ -129,7 +126,6 @@ typegen: - storage.DistributionBucketStatusUpdated - storage.DistributionBucketDeleted - storage.DistributionBucketsUpdatedForBag - - storage.DistributionBucketsPerBagLimitUpdated - storage.DistributionBucketModeUpdated - storage.DistributionBucketOperatorInvited - storage.DistributionBucketInvitationCancelled @@ -137,9 +133,6 @@ typegen: - storage.DistributionBucketMetadataSet - storage.DistributionBucketOperatorRemoved - storage.DistributionBucketFamilyMetadataSet - # Not required: - # - storage.NumberOfStorageBucketsInDynamicBagCreationPolicyUpdated - # - storage.FamiliesInDynamicBagCreationPolicyUpdated # Council - council.AnnouncingPeriodStarted @@ -167,20 +160,21 @@ typegen: - referendum.VoteRevealed - referendum.StakeReleased # Bounty - - bounty.BountyCreated - - bounty.BountyCanceled - - bounty.BountyVetoed - - bounty.BountyFunded - - bounty.BountyMaxFundingReached - - bounty.BountyFundingWithdrawal - - bounty.BountyCreatorCherryWithdrawal - - bounty.BountyRemoved - - bounty.WorkEntryAnnounced - - bounty.WorkEntryWithdrawn - - bounty.WorkEntrySlashed - - bounty.WorkSubmitted - - bounty.OracleJudgmentSubmitted - - bounty.WorkEntrantFundsWithdrawn + # TODO: uncomment this + event handlers below after bounties are repaired + # - bounty.BountyCreated + # - bounty.BountyCanceled + # - bounty.BountyVetoed + # - bounty.BountyFunded + # - bounty.BountyMaxFundingReached + # - bounty.BountyFundingWithdrawal + # - bounty.BountyCreatorCherryWithdrawal + # - bounty.BountyRemoved + # - bounty.WorkEntryAnnounced + # - bounty.WorkEntryWithdrawn + # - bounty.WorkEntrySlashed + # - bounty.WorkSubmitted + # - bounty.OracleJudgmentSubmitted + # - bounty.WorkEntrantFundsWithdrawn # content NFTs - content.OpenAuctionStarted - content.EnglishAuctionStarted @@ -216,6 +210,10 @@ mappings: # Membership module - event: members.MembershipBought handler: members_MembershipBought + - event: members.MembershipGifted + handler: members_MembershipGifted + - event: members.MemberCreated + handler: members_MemberCreated - event: members.MemberProfileUpdated handler: members_MemberProfileUpdated - event: members.MemberAccountsUpdated @@ -242,6 +240,8 @@ mappings: handler: members_InitialInvitationBalanceUpdated - event: members.LeaderInvitationQuotaUpdated handler: members_LeaderInvitationQuotaUpdated + - event: members.MemberRemarked + handler: members_MemberRemarked # Storage working group - event: storageWorkingGroup.OpeningAdded handler: workingGroups_OpeningAdded @@ -602,50 +602,50 @@ mappings: handler: workingGroups_NewMissedRewardLevelReached - event: distributionWorkingGroup.WorkerStartedLeaving handler: workingGroups_WorkerStartedLeaving - # Gateway working group - - event: gatewayWorkingGroup.OpeningAdded + # Apps working group + - event: appWorkingGroup.OpeningAdded handler: workingGroups_OpeningAdded - - event: gatewayWorkingGroup.AppliedOnOpening + - event: appWorkingGroup.AppliedOnOpening handler: workingGroups_AppliedOnOpening - - event: gatewayWorkingGroup.OpeningFilled + - event: appWorkingGroup.OpeningFilled handler: workingGroups_OpeningFilled - - event: gatewayWorkingGroup.LeaderSet + - event: appWorkingGroup.LeaderSet handler: workingGroups_LeaderSet - - event: gatewayWorkingGroup.WorkerRoleAccountUpdated + - event: appWorkingGroup.WorkerRoleAccountUpdated handler: workingGroups_WorkerRoleAccountUpdated - - event: gatewayWorkingGroup.LeaderUnset + - event: appWorkingGroup.LeaderUnset handler: workingGroups_LeaderUnset - - event: gatewayWorkingGroup.WorkerExited + - event: appWorkingGroup.WorkerExited handler: workingGroups_WorkerExited - - event: gatewayWorkingGroup.TerminatedWorker + - event: appWorkingGroup.TerminatedWorker handler: workingGroups_TerminatedWorker - - event: gatewayWorkingGroup.TerminatedLeader + - event: appWorkingGroup.TerminatedLeader handler: workingGroups_TerminatedLeader - - event: gatewayWorkingGroup.StakeSlashed + - event: appWorkingGroup.StakeSlashed handler: workingGroups_StakeSlashed - - event: gatewayWorkingGroup.StakeDecreased + - event: appWorkingGroup.StakeDecreased handler: workingGroups_StakeDecreased - - event: gatewayWorkingGroup.StakeIncreased + - event: appWorkingGroup.StakeIncreased handler: workingGroups_StakeIncreased - - event: gatewayWorkingGroup.ApplicationWithdrawn + - event: appWorkingGroup.ApplicationWithdrawn handler: workingGroups_ApplicationWithdrawn - - event: gatewayWorkingGroup.OpeningCanceled + - event: appWorkingGroup.OpeningCanceled handler: workingGroups_OpeningCanceled - - event: gatewayWorkingGroup.BudgetSet + - event: appWorkingGroup.BudgetSet handler: workingGroups_BudgetSet - - event: gatewayWorkingGroup.WorkerRewardAccountUpdated + - event: appWorkingGroup.WorkerRewardAccountUpdated handler: workingGroups_WorkerRewardAccountUpdated - - event: gatewayWorkingGroup.WorkerRewardAmountUpdated + - event: appWorkingGroup.WorkerRewardAmountUpdated handler: workingGroups_WorkerRewardAmountUpdated - - event: gatewayWorkingGroup.StatusTextChanged + - event: appWorkingGroup.StatusTextChanged handler: workingGroups_StatusTextChanged - - event: gatewayWorkingGroup.BudgetSpending + - event: appWorkingGroup.BudgetSpending handler: workingGroups_BudgetSpending - - event: gatewayWorkingGroup.RewardPaid + - event: appWorkingGroup.RewardPaid handler: workingGroups_RewardPaid - - event: gatewayWorkingGroup.NewMissedRewardLevelReached + - event: appWorkingGroup.NewMissedRewardLevelReached handler: workingGroups_NewMissedRewardLevelReached - - event: gatewayWorkingGroup.WorkerStartedLeaving + - event: appWorkingGroup.WorkerStartedLeaving handler: workingGroups_WorkerStartedLeaving # Proposals - event: proposalsCodex.ProposalCreated @@ -694,10 +694,6 @@ mappings: handler: forum_PostDeleted - event: forum.PostTextUpdated handler: forum_PostTextUpdated - - event: forum.PostReacted - handler: forum_PostReacted - - event: forum.VoteOnPoll - handler: forum_VoteOnPoll - event: forum.CategoryStickyThreadUpdate handler: forum_CategoryStickyThreadUpdate - event: forum.CategoryMembershipOfModeratorUpdated @@ -717,33 +713,31 @@ mappings: handler: content_ChannelUpdated - event: content.ChannelAssetsRemoved handler: content_ChannelAssetsRemoved - - event: content.ChannelCensorshipStatusUpdated - handler: content_ChannelCensorshipStatusUpdated - - event: content.ChannelCategoryCreated - handler: content_ChannelCategoryCreated - - event: content.ChannelCategoryUpdated - handler: content_ChannelCategoryUpdated - - event: content.ChannelCategoryDeleted - handler: content_ChannelCategoryDeleted - - event: content.VideoCategoryCreated - handler: content_VideoCategoryCreated - - event: content.VideoCategoryUpdated - handler: content_VideoCategoryUpdated - - event: content.VideoCategoryDeleted - handler: content_VideoCategoryDeleted - event: content.VideoCreated handler: content_ContentCreated - event: content.VideoUpdated handler: content_ContentUpdated - event: content.VideoDeleted handler: content_ContentDeleted - - event: content.VideoCensorshipStatusUpdated - handler: content_VideoCensorshipStatusUpdated - - event: content.FeaturedVideosSet - handler: content_FeaturedVideosSet - event: content.ChannelDeleted handler: content_ChannelDeleted + - event: content.ChannelDeletedByModerator + handler: content_ChannelDeletedByModerator + - event: content.VideoDeletedByModerator + handler: content_VideoDeletedByModerator + - event: content.ChannelAssetsDeletedByModerator + handler: content_ChannelAssetsDeletedByModerator + - event: content.VideoAssetsDeletedByModerator + handler: content_VideoAssetsDeletedByModerator + - event: content.VideoVisibilitySetByModerator + handler: content_VideoVisibilitySetByModerator + - event: content.ChannelVisibilitySetByModerator + handler: content_ChannelVisibilitySetByModerator + - event: content.ChannelOwnerRemarked + handler: content_ChannelOwnerRemarked + - event: content.ChannelAgentRemarked + handler: content_ChannelAgentRemarked # content NFTs - event: content.OpenAuctionStarted handler: contentNft_OpenAuctionStarted @@ -789,6 +783,8 @@ mappings: handler: storage_StorageBucketsUpdatedForBag - event: storage.DataObjectsUploaded handler: storage_DataObjectsUploaded + - event: storage.DataObjectsUpdated + handler: storage_DataObjectsUpdated - event: storage.StorageOperatorMetadataSet handler: storage_StorageOperatorMetadataSet - event: storage.StorageBucketVoucherLimitsSet @@ -801,22 +797,12 @@ mappings: handler: storage_StorageBucketOperatorInvited - event: storage.StorageBucketOperatorRemoved handler: storage_StorageBucketOperatorRemoved - - event: storage.UploadingBlockStatusUpdated - handler: storage_UploadingBlockStatusUpdated - - event: storage.DataObjectPerMegabyteFeeUpdated - handler: storage_DataObjectPerMegabyteFeeUpdated - - event: storage.StorageBucketsPerBagLimitUpdated - handler: storage_StorageBucketsPerBagLimitUpdated - - event: storage.StorageBucketsVoucherMaxLimitsUpdated - handler: storage_StorageBucketsVoucherMaxLimitsUpdated - event: storage.DataObjectsMoved handler: storage_DataObjectsMoved - event: storage.DataObjectsDeleted handler: storage_DataObjectsDeleted - event: storage.StorageBucketStatusUpdated handler: storage_StorageBucketStatusUpdated - - event: storage.UpdateBlacklist - handler: storage_UpdateBlacklist - event: storage.DynamicBagDeleted handler: storage_DynamicBagDeleted - event: storage.DynamicBagCreated @@ -837,8 +823,6 @@ mappings: handler: storage_DistributionBucketDeleted - event: storage.DistributionBucketsUpdatedForBag handler: storage_DistributionBucketsUpdatedForBag - - event: storage.DistributionBucketsPerBagLimitUpdated - handler: storage_DistributionBucketsPerBagLimitUpdated - event: storage.DistributionBucketModeUpdated handler: storage_DistributionBucketModeUpdated - event: storage.DistributionBucketOperatorInvited @@ -903,39 +887,39 @@ mappings: - event: referendum.StakeReleased handler: referendum_StakeReleased # Bounty - - event: bounty.BountyCreated - handler: bounty_BountyCreated - - event: bounty.BountyCanceled - handler: bounty_BountyCanceled - - event: bounty.BountyVetoed - handler: bounty_BountyVetoed - - event: bounty.BountyFunded - handler: bounty_BountyFunded - - event: bounty.BountyMaxFundingReached - handler: bounty_BountyMaxFundingReached - - event: bounty.BountyFundingWithdrawal - handler: bounty_BountyFundingWithdrawal - - event: bounty.BountyCreatorCherryWithdrawal - handler: bounty_BountyCreatorCherryWithdrawal - - event: bounty.BountyRemoved - handler: bounty_BountyRemoved - - event: bounty.WorkEntryAnnounced - handler: bounty_WorkEntryAnnounced - - event: bounty.WorkEntryWithdrawn - handler: bounty_WorkEntryWithdrawn - - event: bounty.WorkEntrySlashed - handler: bounty_WorkEntrySlashed - - event: bounty.WorkSubmitted - handler: bounty_WorkSubmitted - - event: bounty.OracleJudgmentSubmitted - handler: bounty_OracleJudgmentSubmitted - - event: bounty.WorkEntrantFundsWithdrawn - handler: bounty_WorkEntrantFundsWithdrawn + # - event: bounty.BountyCreated + # handler: bounty_BountyCreated + # - event: bounty.BountyCanceled + # handler: bounty_BountyCanceled + # - event: bounty.BountyVetoed + # handler: bounty_BountyVetoed + # - event: bounty.BountyFunded + # handler: bounty_BountyFunded + # - event: bounty.BountyMaxFundingReached + # handler: bounty_BountyMaxFundingReached + # - event: bounty.BountyFundingWithdrawal + # handler: bounty_BountyFundingWithdrawal + # - event: bounty.BountyCreatorCherryWithdrawal + # handler: bounty_BountyCreatorCherryWithdrawal + # - event: bounty.BountyRemoved + # handler: bounty_BountyRemoved + # - event: bounty.WorkEntryAnnounced + # handler: bounty_WorkEntryAnnounced + # - event: bounty.WorkEntryWithdrawn + # handler: bounty_WorkEntryWithdrawn + # - event: bounty.WorkEntrySlashed + # handler: bounty_WorkEntrySlashed + # - event: bounty.WorkSubmitted + # handler: bounty_WorkSubmitted + # - event: bounty.OracleJudgmentSubmitted + # handler: bounty_OracleJudgmentSubmitted + # - event: bounty.WorkEntrantFundsWithdrawn + # handler: bounty_WorkEntrantFundsWithdrawn # ExtrinsicSuccess event handler - we're using an empty handler just for the purpose of triggering # preBlock/postBlock hooks for each block (instead of "catching-up" after some event/tx recognized by processor is fired) # ExtrinsicSuccess is emitted at least once per block due to timestamp.set extrinsic - - event: system.ExtrinsicSuccess - handler: system_ExtrinsicSuccess + # - event: system.ExtrinsicSuccess + # handler: system_ExtrinsicSuccess # Utility - event: joystreamUtility.UpdatedWorkingGroupBudget handler: joystreamUtility_UpdatedWorkingGroupBudget @@ -947,6 +931,6 @@ mappings: preBlockHooks: - handler: bootstrapData filter: - height: "[0,0]" # will be executed only at genesis - postBlockHooks: - - handler: runScheduler + height: '[0,0]' # will be executed only at genesis + # postBlockHooks: + # - handler: runScheduler diff --git a/query-node/mappings/.eslintignore b/query-node/mappings/.eslintignore index 6c9b9d9991..68d327d630 100644 --- a/query-node/mappings/.eslintignore +++ b/query-node/mappings/.eslintignore @@ -1,2 +1,3 @@ lib/ generated +src/bounty.ts diff --git a/query-node/mappings/package.json b/query-node/mappings/package.json index 023dee478f..13cf96aae1 100644 --- a/query-node/mappings/package.json +++ b/query-node/mappings/package.json @@ -5,8 +5,7 @@ "main": "lib/src/index.js", "license": "MIT", "scripts": { - "build": "rm -rf lib && tsc --build tsconfig.json && yarn copy-types", - "copy-types": "cp ../../types/augment/all/defs.json lib/generated/types/typedefs.json", + "build": "rm -rf lib && tsc --build tsconfig.json", "clean": "rm -rf lib", "lint": "eslint . --ext .ts", "checks": "prettier ./ --check && yarn lint", @@ -17,12 +16,12 @@ "bootstrap-data:fetch": "yarn bootstrap-data:fetch:members && yarn bootstrap-data:fetch:workingGroups && yarn bootstrap-data:fetch:categories" }, "dependencies": { - "@polkadot/types": "5.9.1", - "@joystream/hydra-common": "^3.1.0-alpha.26", - "@joystream/hydra-db-utils": "^3.1.0-alpha.26", - "@joystream/metadata-protobuf": "^2.1.0", - "@joystream/types": "^0.19.3", - "@joystream/warthog": "^2.41.4", + "@polkadot/types": "8.9.1", + "@joystream/hydra-common": "4.0.0-alpha.9", + "@joystream/hydra-db-utils": "4.0.0-alpha.9", + "@joystream/metadata-protobuf": "^2.5.0", + "@joystream/types": "^0.20.5", + "@joystream/warthog": "^2.41.9", "@apollo/client": "^3.2.5" }, "devDependencies": { diff --git a/query-node/mappings/src/bootstrap-data/data/members.json b/query-node/mappings/src/bootstrap-data/data/members.json deleted file mode 100644 index fe51488c70..0000000000 --- a/query-node/mappings/src/bootstrap-data/data/members.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/query-node/mappings/src/bootstrap-data/data/membershipSystem.json b/query-node/mappings/src/bootstrap-data/data/membershipSystem.json deleted file mode 100644 index cd702e54df..0000000000 --- a/query-node/mappings/src/bootstrap-data/data/membershipSystem.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "defaultInviteCount": 5, - "membershipPrice": 100, - "referralCut": 0, - "invitedInitialBalance": 100 -} diff --git a/query-node/mappings/src/bootstrap-data/data/storageSystem.json b/query-node/mappings/src/bootstrap-data/data/storageSystem.json deleted file mode 100644 index 7f867d9900..0000000000 --- a/query-node/mappings/src/bootstrap-data/data/storageSystem.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "1", - "blacklist": [], - "storageBucketsPerBagLimit": 0, - "distributionBucketsPerBagLimit": 0, - "uploadingBlocked": false, - "dataObjectFeePerMb": 0, - "storageBucketMaxObjectsCountLimit": 0, - "storageBucketMaxObjectsSizeLimit": 0, - "nextDataObjectId": 0 -} diff --git a/query-node/mappings/src/bootstrap-data/data/videoCategories.json b/query-node/mappings/src/bootstrap-data/data/videoCategories.json deleted file mode 100644 index fe51488c70..0000000000 --- a/query-node/mappings/src/bootstrap-data/data/videoCategories.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/query-node/mappings/src/bootstrap-data/data/workingGroups.json b/query-node/mappings/src/bootstrap-data/data/workingGroups.json index f8a552e92c..9010cb3045 100644 --- a/query-node/mappings/src/bootstrap-data/data/workingGroups.json +++ b/query-node/mappings/src/bootstrap-data/data/workingGroups.json @@ -20,7 +20,7 @@ "budget": 0 }, { - "name": "gatewayWorkingGroup", + "name": "appWorkingGroup", "budget": 0 }, { diff --git a/query-node/mappings/src/bootstrap-data/index.ts b/query-node/mappings/src/bootstrap-data/index.ts index 5edf04f7b4..80486daa7c 100644 --- a/query-node/mappings/src/bootstrap-data/index.ts +++ b/query-node/mappings/src/bootstrap-data/index.ts @@ -1,12 +1,6 @@ -import { StorageSystemJson, WorkingGroupJson, MembershipSystemJson, MemberJson } from './types' -import storageSystemJson from './data/storageSystem.json' -import membersJson from './data/members.json' +import { WorkingGroupJson } from './types' import workingGroupsJson from './data/workingGroups.json' -import membershipSystemJson from './data/membershipSystem.json' -const storageSystemData: StorageSystemJson = storageSystemJson -const membersData: MemberJson[] = membersJson const workingGroupsData: WorkingGroupJson[] = workingGroupsJson -const membershipSystemData: MembershipSystemJson = membershipSystemJson -export { storageSystemData, membersData, workingGroupsData, membershipSystemData } +export { workingGroupsData } diff --git a/query-node/mappings/src/bootstrap-data/types.ts b/query-node/mappings/src/bootstrap-data/types.ts index 5800d00a36..4708d90453 100644 --- a/query-node/mappings/src/bootstrap-data/types.ts +++ b/query-node/mappings/src/bootstrap-data/types.ts @@ -1,47 +1,4 @@ -export type MemberJson = { - member_id: number - root_account: string - controller_account: string - handle: string - about: string - avatar_uri: string -} - -export type StorageSystemJson = { - id: string - blacklist: string[] - storageBucketsPerBagLimit: number - distributionBucketsPerBagLimit: number - uploadingBlocked: boolean - dataObjectFeePerMb: number | string - storageBucketMaxObjectsCountLimit: number | string - storageBucketMaxObjectsSizeLimit: number | string -} - export type WorkingGroupJson = { name: string budget: number } - -export type VideoCategoryJson = { - id: string - name: string - createdInBlock: number - createdAt: string - updatedAt: string -} - -export type ChannelCategoryJson = { - id: string - name: string - createdInBlock: number - createdAt: string - updatedAt: string -} - -export type MembershipSystemJson = { - defaultInviteCount: number - membershipPrice: number - referralCut: number - invitedInitialBalance: number -} diff --git a/query-node/mappings/src/bootstrap.ts b/query-node/mappings/src/bootstrap.ts index aac49036c9..e5b4633bd2 100644 --- a/query-node/mappings/src/bootstrap.ts +++ b/query-node/mappings/src/bootstrap.ts @@ -1,52 +1,13 @@ import { DatabaseManager, StoreContext } from '@joystream/hydra-common' import BN from 'bn.js' -import { - StorageSystemParameters, - MembershipSystemSnapshot, - WorkingGroup, - ElectedCouncil, - ElectionRound, - MembershipEntryGenesis, - CouncilStageUpdate, - CouncilStageAnnouncing, -} from 'query-node/dist/model' -import { storageSystemData, membershipSystemData, workingGroupsData, membersData } from './bootstrap-data' -import { createNewMember } from './membership' +import { WorkingGroup, ElectedCouncil, CouncilStageUpdate, CouncilStageIdle } from 'query-node/dist/model' +import { workingGroupsData } from './bootstrap-data' import { CURRENT_NETWORK } from './common' -import { MembershipMetadata } from '@joystream/metadata-protobuf' export async function bootstrapData({ store }: StoreContext): Promise { - await initMembershipSystem(store) - await initMembers(store) - await initStorageSystem(store) await initWorkingGroups(store) - await initFirstElectionRound(store) -} - -async function initMembershipSystem(store: DatabaseManager): Promise { - await store.save( - new MembershipSystemSnapshot({ - createdAt: new Date(0), - updatedAt: new Date(0), - snapshotBlock: 0, - ...membershipSystemData, - membershipPrice: new BN(membershipSystemData.membershipPrice), - invitedInitialBalance: new BN(membershipSystemData.invitedInitialBalance), - }) - ) -} - -async function initStorageSystem(store: DatabaseManager): Promise { - // Storage system - await store.save( - new StorageSystemParameters({ - ...storageSystemData, - storageBucketMaxObjectsCountLimit: new BN(storageSystemData.storageBucketMaxObjectsCountLimit), - storageBucketMaxObjectsSizeLimit: new BN(storageSystemData.storageBucketMaxObjectsSizeLimit), - dataObjectFeePerMb: new BN(storageSystemData.dataObjectFeePerMb), - }) - ) + await initCouncil(store) } async function initWorkingGroups(store: DatabaseManager): Promise { @@ -54,8 +15,6 @@ async function initWorkingGroups(store: DatabaseManager): Promise { workingGroupsData.map(async (group) => store.save( new WorkingGroup({ - createdAt: new Date(0), - updatedAt: new Date(0), id: group.name, name: group.name, budget: new BN(group.budget), @@ -65,7 +24,7 @@ async function initWorkingGroups(store: DatabaseManager): Promise { ) } -async function initFirstElectionRound(store: DatabaseManager): Promise { +async function initCouncil(store: DatabaseManager): Promise { const electedCouncil = new ElectedCouncil({ councilMembers: [], updates: [], @@ -78,17 +37,8 @@ async function initFirstElectionRound(store: DatabaseManager): Promise { }) await store.save(electedCouncil) - const initialElectionRound = new ElectionRound({ - cycleId: 0, - isFinished: false, - castVotes: [], - electedCouncil, - candidates: [], - }) - await store.save(initialElectionRound) - - const stage = new CouncilStageAnnouncing() - stage.candidatesCount = new BN(0) + const stage = new CouncilStageIdle() + stage.endsAt = 1 const initialStageUpdate = new CouncilStageUpdate({ stage, electedCouncil, @@ -96,22 +46,3 @@ async function initFirstElectionRound(store: DatabaseManager): Promise { }) await store.save(initialStageUpdate) } - -async function initMembers(store: DatabaseManager) { - for (const member of membersData) { - await createNewMember( - store, - new Date(0), - member.member_id.toString(), - new MembershipEntryGenesis(), - member.root_account, - member.controller_account, - member.handle, - 0, - new MembershipMetadata({ - about: member.about, - avatarUri: member.avatar_uri, - }) - ) - } -} diff --git a/query-node/mappings/src/bounty.ts b/query-node/mappings/src/bounty.ts index b7a20bcd77..7da81247e7 100644 --- a/query-node/mappings/src/bounty.ts +++ b/query-node/mappings/src/bounty.ts @@ -1,4 +1,4 @@ -import { DatabaseManager, EventContext, StoreContext, SubstrateEvent } from '@joystream/hydra-common' +import { DatabaseManager, EventContext, StoreContext, SubstrateEvent, FindOneOptions } from '@joystream/hydra-common' import { BountyMetadata, BountyWorkData } from '@joystream/metadata-protobuf' import { AssuranceContractType, @@ -8,7 +8,7 @@ import { FundingType, OracleWorkEntryJudgment, } from '@joystream/types/augment' -import { MemberId } from '@joystream/types/common' +import { MemberId } from '@joystream/types/primitives' import { BN } from '@polkadot/util' import { Bounty, @@ -49,7 +49,7 @@ import { scheduleAtBlock } from './scheduler' */ async function getBounty(store: DatabaseManager, bountyId: BountyId | string, relations?: string[]): Promise { - const bounty = await store.get(Bounty, { where: { id: bountyId }, relations }) + const bounty = await store.get(Bounty, { where: { id: bountyId }, relations } as FindOneOptions) if (!bounty) { throw new Error(`Bounty not found by id: ${bountyId}`) } @@ -62,12 +62,13 @@ function getContribution( contributorId: string | undefined ): Promise { return store.get(BountyContribution, { - where: { bounty: { id: bountyId }, contributor: { id: contributorId ?? null } }, + // where: { bounty: { id: bountyId.toString() }, contributor: { id: contributorId ?? null } }, + where: { bounty: { id: bountyId.toString() }, contributor: { id: contributorId } }, // TODO: check this is ok }) } async function getEntry(store: DatabaseManager, entryId: EntryId): Promise { - const entry = await store.get(BountyEntry, { where: { id: entryId } }) + const entry = await store.get(BountyEntry, { where: { id: entryId.toString() } }) if (!entry) { throw new Error(`Entry not found by id: ${entryId}`) } @@ -82,7 +83,6 @@ async function updateBounty( changes: (bounty: Bounty) => Partial ) { const bounty = await getBounty(store, bountyId, relations) - bounty.updatedAt = new Date(event.blockTimestamp) Object.assign(bounty, changes(bounty)) await store.save(bounty) @@ -97,7 +97,6 @@ async function updateEntry( changes: (entry: BountyEntry) => Partial = () => ({}) ) { const entry = await getEntry(store, entryId) - entry.updatedAt = new Date(event.blockTimestamp) Object.assign(entry, changes(entry)) await store.save(entry) @@ -170,18 +169,15 @@ function endFundingPeriod( store: DatabaseManager, bounty: Bounty, blockNumber: number, - isFunded: boolean, - updatedAt = new Date() + isFunded: boolean ): Promise { if (isFunded) { // Go to Working period - bounty.updatedAt = updatedAt bounty.stage = BountyStage.WorkSubmission bountyScheduleWorkSubmissionEnd(bounty, blockNumber + bounty.workPeriod) return store.save(bounty) } else if (bounty.totalFunding.eqn(0)) { // Go to Expired Funding Period - bounty.updatedAt = updatedAt bounty.stage = BountyStage.Expired return store.save(bounty) } else { @@ -193,7 +189,6 @@ function endFundingPeriod( function endWorkingPeriod(store: DatabaseManager, bounty: Bounty, blockNumber: number): Promise { if (bounty.entries?.some((entry) => entry.workSubmitted)) { // Go to Judgement Period - bounty.updatedAt = new Date() bounty.stage = BountyStage.Judgment bountyScheduleJudgmentEnd(bounty, blockNumber + bounty.judgingPeriod) return store.save(bounty) @@ -211,7 +206,6 @@ async function goToWithdrawalPeriod( ): Promise { // Update the bounty status const hasWinners = judgementEntries.some(([, judgment]) => judgment.isWinner) - bounty.updatedAt = new Date() bounty.stage = BountyStage[hasWinners ? 'Successful' : 'Failed'] await store.save(bounty) @@ -259,8 +253,6 @@ export async function bounty_BountyCreated({ event, store }: EventContext & Stor // Create the bounty const bounty = new Bounty({ id: String(bountyId), - createdAt: eventTime, - updatedAt: eventTime, title: whenDef(metadata?.title, perpareString), description: whenDef(metadata?.description, perpareString), bannerImageUri: whenDef(metadata?.bannerImageUri, perpareString), @@ -352,7 +344,6 @@ export async function bounty_BountyFunded({ event, store }: EventContext & Store } else { contribution = new BountyContribution({ createdAt: eventTime, bounty, contributor, amount }) } - contribution.updatedAt = eventTime await store.save(contribution) // Record the event @@ -364,11 +355,10 @@ export async function bounty_BountyFunded({ event, store }: EventContext & Store export async function bounty_BountyMaxFundingReached({ event, store }: EventContext & StoreContext): Promise { const maxFundingReachedEvent = new BountyEvents.BountyMaxFundingReachedEvent(event) const [bountyId] = maxFundingReachedEvent.params - const eventTime = new Date(event.blockTimestamp) // Update the bounty stage const bounty = await getBounty(store, bountyId) - await endFundingPeriod(store, bounty, event.blockNumber, true, eventTime) + await endFundingPeriod(store, bounty, event.blockNumber, true) // Record the event const maxFundingReachedInEvent = new BountyMaxFundingReachedEvent({ ...genericEventFields(event), bounty }) @@ -388,7 +378,6 @@ export async function bounty_BountyFundingWithdrawal({ event, store }: EventCont const actorType = typeof contributor === 'undefined' ? 'council' : `member id ${contributor}` throw new Error(`Bounty contribution not found by contributor: ${actorType}`) } - contribution.updatedAt = eventTime await store.save(contribution) // Record the event @@ -426,13 +415,10 @@ export async function bounty_BountyRemoved({ event, store }: EventContext & Stor export async function bounty_WorkEntryAnnounced({ event, store }: EventContext & StoreContext): Promise { const entryAnnouncedEvent = new BountyEvents.WorkEntryAnnouncedEvent(event) const [bountyId, entryId, memberId, accountId] = entryAnnouncedEvent.params - const eventTime = new Date(event.blockTimestamp) // Create the entry const entry = new BountyEntry({ id: String(entryId), - createdAt: eventTime, - updatedAt: eventTime, bounty: new Bounty({ id: String(bountyId) }), worker: new Membership({ id: String(memberId) }), stakingAccount: String(accountId), @@ -503,7 +489,7 @@ export async function bounty_OracleJudgmentSubmitted({ event, store }: EventCont const entryJudgments = Array.from(bountyJudgment.entries()) // Go to Withdrawal Period (and update entries statuses) - goToWithdrawalPeriod(store, bounty, entryJudgments) + await goToWithdrawalPeriod(store, bounty, entryJudgments) // Record the event const judgmentEvent = new OracleJudgmentSubmittedEvent({ diff --git a/query-node/mappings/src/common.ts b/query-node/mappings/src/common.ts index 652f80f3d2..4d11e31aa7 100644 --- a/query-node/mappings/src/common.ts +++ b/query-node/mappings/src/common.ts @@ -1,8 +1,17 @@ -import { DatabaseManager, SubstrateEvent } from '@joystream/hydra-common' +import { DatabaseManager, SubstrateEvent, FindOneOptions } from '@joystream/hydra-common' import { Bytes } from '@polkadot/types' import { Codec } from '@polkadot/types/types' -import { WorkingGroup as WGType, WorkerId } from '@joystream/types/augment/all' -import { Worker, Event, Network, WorkingGroup as WGEntity } from 'query-node/dist/model' +import { WorkerId } from '@joystream/types/primitives' +import { PalletCommonWorkingGroupIterableEnumsWorkingGroup as WGType } from '@polkadot/types/lookup' +import { + Worker, + Event, + Network, + WorkingGroup as WGEntity, + MetaprotocolTransactionStatusEvent, + MetaprotocolTransactionErrored, + MetaprotocolTransactionSuccessful, +} from 'query-node/dist/model' import { BaseModel } from '@joystream/warthog' import { metaToObject } from '@joystream/metadata-protobuf/utils' import { AnyMetadataClass, DecodedMetadataObject } from '@joystream/metadata-protobuf/types' @@ -10,6 +19,10 @@ import BN from 'bn.js' export const CURRENT_NETWORK = Network.OLYMPIA +// used to create Ids for metaprotocol entities (entities that don't +// have any runtime existence; and solely exist on the Query node). +export const METAPROTOCOL = 'METAPROTOCOL' + // Max value the database can store in Int column field export const INT32MAX = 2147483647 @@ -46,12 +59,17 @@ class Logger { export const logger = new Logger() +/* + Get Id of new metaprotocol entity in Query node DB + */ +export function newMetaprotocolEntityId(substrateEvent: SubstrateEvent): string { + const { blockNumber, indexInBlock } = substrateEvent + return `${METAPROTOCOL}-${CURRENT_NETWORK}-${blockNumber}-${indexInBlock}` +} + export function genericEventFields(substrateEvent: SubstrateEvent): Partial { - const { blockNumber, indexInBlock, extrinsic, blockTimestamp } = substrateEvent - const eventTime = new Date(blockTimestamp) + const { blockNumber, indexInBlock, extrinsic } = substrateEvent return { - createdAt: eventTime, - updatedAt: eventTime, id: `${CURRENT_NETWORK}-${blockNumber}-${indexInBlock}`, inBlock: blockNumber, network: CURRENT_NETWORK, @@ -153,7 +171,7 @@ export type WorkingGroupModuleName = | 'forumWorkingGroup' | 'membershipWorkingGroup' | 'operationsWorkingGroupAlpha' - | 'gatewayWorkingGroup' + | 'appWorkingGroup' | 'distributionWorkingGroup' | 'operationsWorkingGroupBeta' | 'operationsWorkingGroupGamma' @@ -169,8 +187,8 @@ export function getWorkingGroupModuleName(group: WGType): WorkingGroupModuleName return 'storageWorkingGroup' } else if (group.isOperationsAlpha) { return 'operationsWorkingGroupAlpha' - } else if (group.isGateway) { - return 'gatewayWorkingGroup' + } else if (group.isApp) { + return 'appWorkingGroup' } else if (group.isDistribution) { return 'distributionWorkingGroup' } else if (group.isOperationsBeta) { @@ -189,7 +207,7 @@ export async function getWorkingGroupByName( ): Promise { const group = await store.get(WGEntity, { where: { name }, relations }) if (!group) { - throw new Error(`Working group ${name} not found!`) + return inconsistentState(`Working group ${name} not found!`) } return group } @@ -203,7 +221,7 @@ export async function getWorker( const workerDbId = `${groupName}-${runtimeId}` const worker = await store.get(Worker, { where: { id: workerDbId }, relations }) if (!worker) { - inconsistentState(`Expected worker not found by id ${workerDbId}`) + return inconsistentState(`Expected worker not found by id ${workerDbId}`) } return worker @@ -225,7 +243,7 @@ export async function getById( id: string, relations?: RelationsArr ): Promise { - const result = await store.get(entityClass, { where: { id }, relations }) + const result = await store.get(entityClass, { where: { id }, relations } as FindOneOptions) if (!result) { throw new Error(`Expected ${entityClass.name} not found by ID: ${id}`) } @@ -259,3 +277,35 @@ export function toNumber(value: BN, maxValue = Number.MAX_SAFE_INTEGER): number return maxValue } } + +export async function saveMetaprotocolTransactionSuccessful( + store: DatabaseManager, + event: SubstrateEvent, + info: Partial +): Promise { + const status = new MetaprotocolTransactionSuccessful() + Object.assign(status, info) + + const metaprotocolTransaction = new MetaprotocolTransactionStatusEvent({ + ...genericEventFields(event), + status, + }) + + await store.save(metaprotocolTransaction) +} + +export async function saveMetaprotocolTransactionErrored( + store: DatabaseManager, + event: SubstrateEvent, + message: string +): Promise { + const status = new MetaprotocolTransactionErrored() + status.message = message + + const metaprotocolTransaction = new MetaprotocolTransactionStatusEvent({ + ...genericEventFields(event), + status, + }) + + await store.save(metaprotocolTransaction) +} diff --git a/query-node/mappings/src/content/channel.ts b/query-node/mappings/src/content/channel.ts index c00d9ca9eb..7b16024372 100644 --- a/query-node/mappings/src/content/channel.ts +++ b/query-node/mappings/src/content/channel.ts @@ -1,20 +1,56 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { EventContext, StoreContext } from '@joystream/hydra-common' -import { Content } from '../../generated/types' -import { convertContentActorToChannelOrNftOwner, processChannelMetadata, unsetAssetRelations } from './utils' -import { Channel, ChannelCategory, StorageDataObject, Membership } from 'query-node/dist/model' -import { deserializeMetadata, inconsistentState, logger } from '../common' -import { ChannelCategoryMetadata, ChannelMetadata } from '@joystream/metadata-protobuf' -import { integrateMeta } from '@joystream/metadata-protobuf/utils' +import { DatabaseManager, EventContext, StoreContext, SubstrateEvent } from '@joystream/hydra-common' +import { ChannelMetadata, ChannelModeratorRemarked, ChannelOwnerRemarked } from '@joystream/metadata-protobuf' +import { ChannelId, DataObjectId } from '@joystream/types/primitives' +import { + Channel, + Collaborator, + ContentActor, + ContentActorCurator, + ContentActorMember, + CuratorGroup, + Membership, + MetaprotocolTransactionSuccessful, + StorageBag, + StorageDataObject, + ChannelAssetsDeletedByModeratorEvent, + ChannelDeletedByModeratorEvent, + ChannelVisibilitySetByModeratorEvent, +} from 'query-node/dist/model' import { In } from 'typeorm' -import { getAllManagers } from '../derivedPropertiesManager/applications' +import { Content } from '../../generated/types' +import { + deserializeMetadata, + inconsistentState, + genericEventFields, + logger, + saveMetaprotocolTransactionSuccessful, + saveMetaprotocolTransactionErrored, +} from '../common' +import { + processBanOrUnbanMemberFromChannelMessage, + processModerateCommentMessage, + processPinOrUnpinCommentMessage, + processVideoReactionsPreferenceMessage, +} from './commentAndReaction' +import { + convertChannelOwnerToMemberOrCuratorGroup, + convertContentActor, + processChannelMetadata, + unsetAssetRelations, + mapAgentPermission, +} from './utils' +import { BTreeMap, BTreeSet, u64 } from '@polkadot/types' +// Joystream types +import { PalletContentIterableEnumsChannelActionPermission } from '@polkadot/types/lookup' export async function content_ChannelCreated(ctx: EventContext & StoreContext): Promise { const { store, event } = ctx // read event data - const [contentActor, channelId, , channelCreationParameters] = new Content.ChannelCreatedEvent(event).params + const [channelId, { owner, dataObjects, channelStateBloatBond }, channelCreationParameters, rewardAccount] = + new Content.ChannelCreatedEvent(event).params // create entity const channel = new Channel({ @@ -23,30 +59,33 @@ export async function content_ChannelCreated(ctx: EventContext & StoreContext): isCensored: false, videos: [], createdInBlock: event.blockNumber, - rewardAccount: channelCreationParameters.reward_account.unwrapOr(undefined)?.toString(), activeVideosCounter: 0, - // fill in auto-generated fields - createdAt: new Date(event.blockTimestamp), - updatedAt: new Date(event.blockTimestamp), - // prepare channel owner (handles fields `ownerMember` and `ownerCuratorGroup`) - ...(await convertContentActorToChannelOrNftOwner(store, contentActor)), + ...(await convertChannelOwnerToMemberOrCuratorGroup(store, owner)), - collaborators: Array.from(channelCreationParameters.collaborators).map( - (id) => new Membership({ id: id.toString() }) - ), + rewardAccount: rewardAccount.toString(), + channelStateBloatBond: channelStateBloatBond.amount, }) // deserialize & process metadata if (channelCreationParameters.meta.isSome) { + const storageBag = await store.get(StorageBag, { where: { id: `dynamic:channel:${channelId.toString()}` } }) + + if (!storageBag) { + inconsistentState(`storageBag for channel ${channelId} does not exist`) + } + const metadata = deserializeMetadata(ChannelMetadata, channelCreationParameters.meta.unwrap()) || {} - await processChannelMetadata(ctx, channel, metadata, channelCreationParameters.assets.unwrapOr(undefined)) + await processChannelMetadata(ctx, channel, metadata, dataObjects) } // save entity await store.save(channel) + // update channel permissions + await updateChannelAgentsPermissions(store, channel, channelCreationParameters.collaborators) + // emit log event logger.info('Channel has been created', { id: channel.id }) } @@ -54,12 +93,11 @@ export async function content_ChannelCreated(ctx: EventContext & StoreContext): export async function content_ChannelUpdated(ctx: EventContext & StoreContext): Promise { const { store, event } = ctx // read event data - const [, channelId, , channelUpdateParameters] = new Content.ChannelUpdatedEvent(event).params + const [, channelId, channelUpdateParameters, newDataObjects] = new Content.ChannelUpdatedEvent(event).params // load channel const channel = await store.get(Channel, { where: { id: channelId.toString() }, - relations: ['category'], }) // ensure channel exists @@ -68,65 +106,107 @@ export async function content_ChannelUpdated(ctx: EventContext & StoreContext): } // prepare changed metadata - const newMetadataBytes = channelUpdateParameters.new_meta.unwrapOr(null) + const newMetadataBytes = channelUpdateParameters.newMeta.unwrapOr(null) // update metadata if it was changed if (newMetadataBytes) { - const newMetadata = deserializeMetadata(ChannelMetadata, newMetadataBytes) || {} - await processChannelMetadata( - ctx, - channel, - newMetadata, - channelUpdateParameters.assets_to_upload.unwrapOr(undefined) - ) - } + const storageBag = await store.get(StorageBag, { where: { id: `dynamic:channel:${channelId.toString()}` } }) - // prepare changed reward account - const newRewardAccount = channelUpdateParameters.reward_account.unwrapOr(null) - // reward account change happened? - if (newRewardAccount) { - // this will change the `channel`! - channel.rewardAccount = newRewardAccount.unwrapOr(undefined)?.toString() - } + if (!storageBag) { + inconsistentState(`storageBag for channel ${channelId} does not exist`) + } - const newCollaborators = channelUpdateParameters.collaborators.unwrapOr(undefined) - if (newCollaborators) { - channel.collaborators = Array.from(newCollaborators).map((id) => new Membership({ id: id.toString() })) + const newMetadata = deserializeMetadata(ChannelMetadata, newMetadataBytes) || {} + await processChannelMetadata(ctx, channel, newMetadata, newDataObjects) } - // set last update time - channel.updatedAt = new Date(event.blockTimestamp) - - // transfer video active counter value to new category - await getAllManagers(store).channels.onMainEntityUpdate(channel) - // save channel await store.save(channel) + // update channel permissions + if (channelUpdateParameters.collaborators.isSome) { + await updateChannelAgentsPermissions(store, channel, channelUpdateParameters.collaborators.unwrap()) + } + // emit log event logger.info('Channel has been updated', { id: channel.id }) } export async function content_ChannelAssetsRemoved({ store, event }: EventContext & StoreContext): Promise { const [, , dataObjectIds] = new Content.ChannelAssetsRemovedEvent(event).params + + await deleteChannelAssets(store, [...dataObjectIds]) +} + +export async function content_ChannelAssetsDeletedByModerator({ + store, + event, +}: EventContext & StoreContext): Promise { + const [actor, channelId, dataObjectIds, rationale] = new Content.ChannelAssetsDeletedByModeratorEvent(event).params + + await deleteChannelAssets(store, [...dataObjectIds]) + + // common event processing - second + + const channelAssetsDeletedByModeratorEvent = new ChannelAssetsDeletedByModeratorEvent({ + ...genericEventFields(event), + actor: await convertContentActor(store, actor), + channelId: channelId.toNumber(), + assetIds: Array.from(dataObjectIds).map((item) => Number(item)), + rationale: rationale.toHuman() as string, + }) + + await store.save(channelAssetsDeletedByModeratorEvent) +} + +async function deleteChannelAssets(store: DatabaseManager, dataObjectIds: DataObjectId[]) { const assets = await store.getMany(StorageDataObject, { where: { id: In(Array.from(dataObjectIds).map((item) => item.toString())), }, }) - await Promise.all(assets.map((a) => unsetAssetRelations(store, a))) - logger.info('Channel assets have been removed', { ids: dataObjectIds.toJSON() }) + + for (const asset of assets) { + await unsetAssetRelations(store, asset) + } + + logger.info('Channel assets have been removed', { ids: dataObjectIds }) +} + +export async function content_ChannelDeleted({ store, event }: EventContext & StoreContext): Promise { + const [, channelId] = new Content.ChannelDeletedEvent(event).params + + await store.remove(new Channel({ id: channelId.toString() })) } -export async function content_ChannelCensorshipStatusUpdated({ +export async function content_ChannelDeletedByModerator({ store, event }: EventContext & StoreContext): Promise { + const [actor, channelId, rationale] = new Content.ChannelDeletedByModeratorEvent(event).params + await store.remove(new Channel({ id: channelId.toString() })) + + // common event processing - second + + const channelDeletedByModeratorEvent = new ChannelDeletedByModeratorEvent({ + ...genericEventFields(event), + + rationale: rationale.toHuman() as string, + actor: await convertContentActor(store, actor), + channelId: channelId.toNumber(), + }) + + await store.save(channelDeletedByModeratorEvent) +} + +export async function content_ChannelVisibilitySetByModerator({ store, event, }: EventContext & StoreContext): Promise { // read event data - const [, channelId, isCensored] = new Content.ChannelCensorshipStatusUpdatedEvent(event).params + const [actor, channelId, isCensored, rationale] = new Content.ChannelVisibilitySetByModeratorEvent(event).params - // load event - const channel = await store.get(Channel, { where: { id: channelId.toString() } }) + // load channel + const channel = await store.get(Channel, { + where: { id: channelId.toString() }, + }) // ensure channel exists if (!channel) { @@ -136,103 +216,199 @@ export async function content_ChannelCensorshipStatusUpdated({ // update channel channel.isCensored = isCensored.isTrue - // set last update time - channel.updatedAt = new Date(event.blockTimestamp) - - await getAllManagers(store).channels.onMainEntityUpdate(channel) - // save channel await store.save(channel) // emit log event logger.info('Channel censorship status has been updated', { id: channelId, isCensored: isCensored.isTrue }) -} -/// //////////////// ChannelCategory //////////////////////////////////////////// + // common event processing - second -export async function content_ChannelCategoryCreated({ store, event }: EventContext & StoreContext): Promise { - // read event data - const [channelCategoryId, , channelCategoryCreationParameters] = new Content.ChannelCategoryCreatedEvent(event).params - - // read metadata - const metadata = deserializeMetadata(ChannelCategoryMetadata, channelCategoryCreationParameters.meta) || {} + const channelVisibilitySetByModeratorEvent = new ChannelVisibilitySetByModeratorEvent({ + ...genericEventFields(event), - // create new channel category - const channelCategory = new ChannelCategory({ - // main data - id: channelCategoryId.toString(), - channels: [], - createdInBlock: event.blockNumber, - activeVideosCounter: 0, - - // fill in auto-generated fields - createdAt: new Date(event.blockTimestamp), - updatedAt: new Date(event.blockTimestamp), + channelId: channelId.toNumber(), + isHidden: isCensored.isTrue, + rationale: rationale.toHuman() as string, + actor: await convertContentActor(store, actor), }) - integrateMeta(channelCategory, metadata, ['name']) - // save channel - await store.save(channelCategory) - - // emit log event - logger.info('Channel category has been created', { id: channelCategory.id }) + await store.save(channelVisibilitySetByModeratorEvent) } -export async function content_ChannelCategoryUpdated({ store, event }: EventContext & StoreContext): Promise { - // read event data - const [, channelCategoryId, channelCategoryUpdateParameters] = new Content.ChannelCategoryUpdatedEvent(event).params +export async function content_ChannelOwnerRemarked(ctx: EventContext & StoreContext): Promise { + const { event, store } = ctx + const [channelId, message] = new Content.ChannelOwnerRemarkedEvent(ctx.event).params - // load channel category - const channelCategory = await store.get(ChannelCategory, { - where: { - id: channelCategoryId.toString(), - }, + // load channel + const channel = await store.get(Channel, { + where: { id: channelId.toString() }, + relations: ['ownerMember', 'ownerCuratorGroup'], }) // ensure channel exists - if (!channelCategory) { - return inconsistentState('Non-existing channel category update requested', channelCategoryId) + if (!channel) { + return inconsistentState('Owner Remarked for Non-existing channel', channelId) } - // read metadata - const newMeta = deserializeMetadata(ChannelCategoryMetadata, channelCategoryUpdateParameters.new_meta) || {} - integrateMeta(channelCategory, newMeta, ['name']) + const getContentActor = (ownerMember?: Membership, ownerCuratorGroup?: CuratorGroup) => { + if (ownerMember) { + const actor = new ContentActorMember() + actor.memberId = ownerMember.id + return actor + } - // set last update time - channelCategory.updatedAt = new Date(event.blockTimestamp) + if (ownerCuratorGroup) { + const actor = new ContentActorCurator() + actor.curatorId = ownerCuratorGroup.id + return actor + } - // save channel category - await store.save(channelCategory) + return inconsistentState('Unknown content actor', { ownerMember, ownerCuratorGroup }) + } - // emit log event - logger.info('Channel category has been updated', { id: channelCategory.id }) + try { + const decodedMessage = ChannelOwnerRemarked.decode(message.toU8a(true)) + const contentActor = getContentActor(channel.ownerMember, channel.ownerCuratorGroup) + + const metaTransactionInfo = await processOwnerRemark(store, event, channelId, contentActor, decodedMessage) + + await saveMetaprotocolTransactionSuccessful(store, event, metaTransactionInfo) + // emit log event + logger.info('Channel owner remarked', { decodedMessage }) + } catch (e) { + // emit log event + logger.info(`Bad metadata for channel owner's remark`, { e }) + + // save metaprotocol info + await saveMetaprotocolTransactionErrored(store, event, `Bad metadata for channel's owner`) + } } -export async function content_ChannelCategoryDeleted({ store, event }: EventContext & StoreContext): Promise { - // read event data - const [, channelCategoryId] = new Content.ChannelCategoryDeletedEvent(event).params +export async function content_ChannelAgentRemarked(ctx: EventContext & StoreContext): Promise { + const { event, store } = ctx + const [moderator, channelId, message] = new Content.ChannelAgentRemarkedEvent(ctx.event).params - // load channel category - const channelCategory = await store.get(ChannelCategory, { - where: { - id: channelCategoryId.toString(), - }, + try { + const decodedMessage = ChannelModeratorRemarked.decode(message.toU8a(true)) + const contentActor = await convertContentActor(store, moderator) + + const metaTransactionInfo = await processModeratorRemark(store, event, channelId, contentActor, decodedMessage) + + await saveMetaprotocolTransactionSuccessful(store, event, metaTransactionInfo) + // emit log event + logger.info('Channel moderator remarked', { decodedMessage }) + } catch (e) { + // emit log event + logger.info(`Bad metadata for channel moderator's remark`, { e }) + + // save metaprotocol info + await saveMetaprotocolTransactionErrored(store, event, `Bad metadata for channel's remark`) + } +} + +async function updateChannelAgentsPermissions( + store: DatabaseManager, + channel: Channel, + collaboratorsPermissions: BTreeMap> +) { + // safest way to update permission is to delete existing and creating new ones + + // delete existing agent permissions + const collaborators = await store.getMany(Collaborator, { + where: { channel: { id: channel.id.toString() } }, }) + for (const agentPermissions of collaborators) { + await store.remove(agentPermissions) + } + + // create new records for privledged members + for (const [memberId, permissions] of Array.from(collaboratorsPermissions)) { + const permissionsArray = Array.from(permissions) - // ensure channel category exists - if (!channelCategory) { - return inconsistentState('Non-existing channel category deletion requested', channelCategoryId) + const collaborator = new Collaborator({ + channel: new Channel({ id: channel.id.toString() }), + member: new Membership({ id: memberId.toString() }), + permissions: Array.from(permissions).map(mapAgentPermission), + }) + + await store.save(collaborator) } +} - // delete channel category - await store.remove(channelCategory) +async function processOwnerRemark( + store: DatabaseManager, + event: SubstrateEvent, + channelId: ChannelId, + contentActor: typeof ContentActor, + decodedMessage: ChannelOwnerRemarked +): Promise> { + const messageType = decodedMessage.channelOwnerRemarked - // emit log event - logger.info('Channel category has been deleted', { id: channelCategory.id }) + if (messageType === 'pinOrUnpinComment') { + await processPinOrUnpinCommentMessage(store, event, contentActor, channelId, decodedMessage.pinOrUnpinComment!) + + return {} + } + + if (messageType === 'banOrUnbanMemberFromChannel') { + await processBanOrUnbanMemberFromChannelMessage( + store, + event, + contentActor, + channelId, + decodedMessage.banOrUnbanMemberFromChannel! + ) + + return {} + } + + if (messageType === 'videoReactionsPreference') { + await processVideoReactionsPreferenceMessage( + store, + event, + contentActor, + channelId, + decodedMessage.videoReactionsPreference! + ) + + return {} + } + + if (messageType === 'moderateComment') { + const comment = await processModerateCommentMessage( + store, + event, + contentActor, + channelId, + decodedMessage.moderateComment! + ) + return { commentModeratedId: comment.id } + } + + return inconsistentState('Unsupported message type in channel owner remark action', messageType) } -export async function content_ChannelDeleted({ store, event }: EventContext & StoreContext): Promise { - const [, channelId] = new Content.ChannelDeletedEvent(event).params +async function processModeratorRemark( + store: DatabaseManager, + event: SubstrateEvent, + channelId: ChannelId, + contentActor: typeof ContentActor, + decodedMessage: ChannelModeratorRemarked +): Promise> { + const messageType = decodedMessage.channelModeratorRemarked + + if (messageType === 'moderateComment') { + const comment = await processModerateCommentMessage( + store, + event, + contentActor, + channelId, + decodedMessage.moderateComment! + ) - await store.remove(new Channel({ id: channelId.toString() })) + return { commentModeratedId: comment.id } + } + + return inconsistentState('Unsupported message type in moderator remark action', messageType) } diff --git a/query-node/mappings/src/content/commentAndReaction.ts b/query-node/mappings/src/content/commentAndReaction.ts new file mode 100644 index 0000000000..474274569c --- /dev/null +++ b/query-node/mappings/src/content/commentAndReaction.ts @@ -0,0 +1,695 @@ +import { DatabaseManager, SubstrateEvent } from '@joystream/hydra-common' +import { + BanOrUnbanMemberFromChannel, + IBanOrUnbanMemberFromChannel, + ICreateComment, + IDeleteComment, + IModerateComment, + IEditComment, + IPinOrUnpinComment, + IReactComment, + IReactVideo, + IVideoReactionsPreference, + PinOrUnpinComment, + ReactVideo, + VideoReactionsPreference, +} from '@joystream/metadata-protobuf' +import { MemberId, ChannelId } from '@joystream/types/primitives' +import { + Channel, + Comment, + CommentCreatedEvent, + CommentDeletedEvent, + CommentModeratedEvent, + CommentPinnedEvent, + CommentReactedEvent, + CommentReaction, + CommentReactionsCountByReactionId, + CommentStatus, + CommentTextUpdatedEvent, + ContentActor, + MemberBannedFromChannelEvent, + Membership, + Video, + VideoReactedEvent, + VideoReaction, + VideoReactionOptions, + VideoReactionsCountByReactionType, + VideoReactionsPreferenceEvent, +} from 'query-node/dist/model' +import { genericEventFields, inconsistentState, newMetaprotocolEntityId } from '../common' + +// TODO: Ensure video is actually a video +// TODO: make sure comment is fully removed (all of its reactions) +// TODO: make sure video is fully removed (all of its comments & reactions) + +async function getChannel(store: DatabaseManager, channelId: string, relations?: string[]): Promise { + const channel = await store.get(Channel, { where: { id: channelId }, relations }) + if (!channel) { + inconsistentState(`Channel not found by id: ${channelId}`) + } + return channel +} + +async function getVideo(store: DatabaseManager, videoId: string, relations?: string[]): Promise