From a5f6bbdc917f73fe1d03e7e1bb1f51f357d49ac8 Mon Sep 17 00:00:00 2001 From: "Mr.zhou" <1422157428@qq.com> Date: Tue, 6 Aug 2024 16:47:20 +0800 Subject: [PATCH] =?UTF-8?q?1.1.6=20=E9=A6=96=E9=A1=B5charts=E6=8F=92?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 2 + Podfile.lock | 2 +- Pods/Manifest.lock | 2 +- ...sic-resources-Debug-input-files.xcfilelist | 3 - ...ic-resources-Debug-output-files.xcfilelist | 2 - ...c-resources-Release-input-files.xcfilelist | 3 - ...-resources-Release-output-files.xcfilelist | 2 - .../Pods-relax.offline.mp3.music-resources.sh | 131 ------------------ .../project.pbxproj | 110 +++++++-------- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../UserInterfaceState.xcuserstate | Bin 0 -> 55034 bytes .../Tool(工具封装)/MP_NetWorkManager.swift | 80 +++++++++++ .../MPPositive_JsonCharts.swift | 5 +- .../MPPositive_HomeViewController.swift | 93 ++----------- 14 files changed, 152 insertions(+), 287 deletions(-) delete mode 100644 Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-input-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-output-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-input-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-output-files.xcfilelist delete mode 100755 Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh create mode 100644 relax.offline.mp3.music.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Podfile b/Podfile index 400e2e5..671ec91 100644 --- a/Podfile +++ b/Podfile @@ -29,4 +29,6 @@ pod "DownloadButton" pod 'Tiercel' #文本跑马灯 pod 'MarqueeLabel' +#广告组 + end diff --git a/Podfile.lock b/Podfile.lock index f8814e6..2fbc0df 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -57,6 +57,6 @@ SPEC CHECKSUMS: SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2 Tiercel: c0a73f876a72800333b15f4e7e48791f4ad21e90 -PODFILE CHECKSUM: 0dbe586b5221e955924da76b16705e9638055ea1 +PODFILE CHECKSUM: a6a950e98b8cead689397a03a4720306543eb266 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index f8814e6..2fbc0df 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -57,6 +57,6 @@ SPEC CHECKSUMS: SwiftDate: 72d28954e8e1c6c1c0f917ccc8005e4f83c7d4b2 Tiercel: c0a73f876a72800333b15f4e7e48791f4ad21e90 -PODFILE CHECKSUM: 0dbe586b5221e955924da76b16705e9638055ea1 +PODFILE CHECKSUM: a6a950e98b8cead689397a03a4720306543eb266 COCOAPODS: 1.15.2 diff --git a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-input-files.xcfilelist deleted file mode 100644 index ecc94c7..0000000 --- a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-input-files.xcfilelist +++ /dev/null @@ -1,3 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh -${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/GoogleMobileAdsResources.bundle -${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform/UserMessagingPlatformResources.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-output-files.xcfilelist deleted file mode 100644 index 3a0a66c..0000000 --- a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Debug-output-files.xcfilelist +++ /dev/null @@ -1,2 +0,0 @@ -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMobileAdsResources.bundle -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UserMessagingPlatformResources.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-input-files.xcfilelist deleted file mode 100644 index ecc94c7..0000000 --- a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-input-files.xcfilelist +++ /dev/null @@ -1,3 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh -${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/GoogleMobileAdsResources.bundle -${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform/UserMessagingPlatformResources.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-output-files.xcfilelist deleted file mode 100644 index 3a0a66c..0000000 --- a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources-Release-output-files.xcfilelist +++ /dev/null @@ -1,2 +0,0 @@ -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleMobileAdsResources.bundle -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/UserMessagingPlatformResources.bundle \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh b/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh deleted file mode 100755 index bc6121d..0000000 --- a/Pods/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-resources.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -function on_error { - echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" -} -trap 'on_error $LINENO' ERR - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/GoogleMobileAdsResources.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform/UserMessagingPlatformResources.bundle" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/Google-Mobile-Ads-SDK/GoogleMobileAdsResources.bundle" - install_resource "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUserMessagingPlatform/UserMessagingPlatformResources.bundle" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/relax.offline.mp3.music.xcodeproj/project.pbxproj b/relax.offline.mp3.music.xcodeproj/project.pbxproj index 640a340..9f05c84 100644 --- a/relax.offline.mp3.music.xcodeproj/project.pbxproj +++ b/relax.offline.mp3.music.xcodeproj/project.pbxproj @@ -7,8 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 46C4D5B84AF3CA6292152C70 /* Pods_relax_offline_mp3_music.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DB1E9160CFEC3A0E35F11BF /* Pods_relax_offline_mp3_music.framework */; }; - CB000F442C12AD2300B0FC0A /* GoogleMobileAds in Frameworks */ = {isa = PBXBuildFile; productRef = CB000F432C12AD2300B0FC0A /* GoogleMobileAds */; }; + 82F33EC0D64393B7AAD72A45 /* Pods_relax_offline_mp3_music.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10D55D4705A4D9E0F0805527 /* Pods_relax_offline_mp3_music.framework */; }; CB0033F02C290AC200B18FD3 /* MPPositive_CustomPlayListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0033EF2C290AC200B18FD3 /* MPPositive_CustomPlayListViewModel.swift */; }; CB0033F22C291C7700B18FD3 /* MPPositive_CollectionListsShowTypeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0033F12C291C7700B18FD3 /* MPPositive_CollectionListsShowTypeView.swift */; }; CB0033F42C294DBF00B18FD3 /* MPPositive_CustomPlayListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0033F32C294DBF00B18FD3 /* MPPositive_CustomPlayListViewController.swift */; }; @@ -26,7 +25,6 @@ CB2CAAD42C59DC1100EF691D /* MPPositive_TrashListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD32C59DC1100EF691D /* MPPositive_TrashListModel.swift */; }; CB2CAAD72C5A1AC500EF691D /* MP_IAPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */; }; CB2CAAD82C5A1AC500EF691D /* MP_IAPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */; }; - CB4FA4D92C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CB4FA4D72C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld */; }; CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */; }; CB7FC5422C2AA01F00292A43 /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5412C2AA01F00292A43 /* FacebookAEM */; }; CB7FC5442C2AA01F00292A43 /* FacebookBasics in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5432C2AA01F00292A43 /* FacebookBasics */; }; @@ -255,12 +253,15 @@ CBDBDDF22C40C40900767F0B /* MPPositive_GridLoadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDBDDF12C40C40900767F0B /* MPPositive_GridLoadViewModel.swift */; }; CBDBDDF42C40D03F00767F0B /* MPPositive_SearchGrideCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDBDDF32C40D03F00767F0B /* MPPositive_SearchGrideCollectionViewCell.swift */; }; CBDBDDF62C40FFC600767F0B /* MPPositive_GrideMoodViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBDBDDF52C40FFC600767F0B /* MPPositive_GrideMoodViewController.swift */; }; + CBDC4A292C61B88300960649 /* relax.offline.mp3.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = CBDC4A272C61B88300960649 /* relax.offline.mp3.xcdatamodeld */; }; + CBDC4A402C6219EF00960649 /* GoogleMobileAds in Frameworks */ = {isa = PBXBuildFile; productRef = CBDC4A3F2C6219EF00960649 /* GoogleMobileAds */; }; CBF3AEDA2C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBF3AED92C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 5D0F6D7469D3B1668D7B52D9 /* Pods-relax.offline.mp3.music.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-relax.offline.mp3.music.release.xcconfig"; path = "Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music.release.xcconfig"; sourceTree = ""; }; - 8DB1E9160CFEC3A0E35F11BF /* Pods_relax_offline_mp3_music.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_relax_offline_mp3_music.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 10D55D4705A4D9E0F0805527 /* Pods_relax_offline_mp3_music.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_relax_offline_mp3_music.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CEDA702C32CE777A8364913 /* Pods-relax.offline.mp3.music.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-relax.offline.mp3.music.debug.xcconfig"; path = "Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music.debug.xcconfig"; sourceTree = ""; }; + 52181392A4B967D8F80363A1 /* Pods-relax.offline.mp3.music.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-relax.offline.mp3.music.release.xcconfig"; path = "Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music.release.xcconfig"; sourceTree = ""; }; CB0033EF2C290AC200B18FD3 /* MPPositive_CustomPlayListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomPlayListViewModel.swift; sourceTree = ""; }; CB0033F12C291C7700B18FD3 /* MPPositive_CollectionListsShowTypeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CollectionListsShowTypeView.swift; sourceTree = ""; }; CB0033F32C294DBF00B18FD3 /* MPPositive_CustomPlayListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CustomPlayListViewController.swift; sourceTree = ""; }; @@ -281,7 +282,6 @@ CB2CAAD32C59DC1100EF691D /* MPPositive_TrashListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_TrashListModel.swift; sourceTree = ""; }; CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_IAPViewController.swift; sourceTree = ""; }; CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_IAPViewController.xib; sourceTree = ""; }; - CB4FA4D82C5CDC4A0027C949 /* MusicPlayer.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MusicPlayer.xcdatamodel; sourceTree = ""; }; CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; CB7FC5472C2AC25C00292A43 /* MPPositive_CenterListSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CenterListSearchView.swift; sourceTree = ""; }; CBAFC9F22C0A10500054500E /* MP_BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_BaseViewController.swift; sourceTree = ""; }; @@ -506,8 +506,8 @@ CBDBDDF12C40C40900767F0B /* MPPositive_GridLoadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_GridLoadViewModel.swift; sourceTree = ""; }; CBDBDDF32C40D03F00767F0B /* MPPositive_SearchGrideCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_SearchGrideCollectionViewCell.swift; sourceTree = ""; }; CBDBDDF52C40FFC600767F0B /* MPPositive_GrideMoodViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_GrideMoodViewController.swift; sourceTree = ""; }; + CBDC4A282C61B88300960649 /* MusicPlayer.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MusicPlayer.xcdatamodel; sourceTree = ""; }; CBF3AED92C255B1200947AFC /* MPPositive_PlayListsShowTypeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_PlayListsShowTypeView.swift; sourceTree = ""; }; - EE70E1FE424F9A64CCD389DD /* Pods-relax.offline.mp3.music.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-relax.offline.mp3.music.debug.xcconfig"; path = "Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -517,14 +517,14 @@ files = ( CB7FC5442C2AA01F00292A43 /* FacebookBasics in Frameworks */, CB7FC5422C2AA01F00292A43 /* FacebookAEM in Frameworks */, + CBDC4A402C6219EF00960649 /* GoogleMobileAds in Frameworks */, CBAFCBAD2C0A10DA0054500E /* FirebaseCrashlytics in Frameworks */, CBD4570D2C2EC38400CE766D /* AppTrackingTransparency.framework in Frameworks */, CBAFCBAB2C0A10DA0054500E /* FirebaseAnalytics in Frameworks */, - CB000F442C12AD2300B0FC0A /* GoogleMobileAds in Frameworks */, - 46C4D5B84AF3CA6292152C70 /* Pods_relax_offline_mp3_music.framework in Frameworks */, CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */, CBAFCBAF2C0A10DA0054500E /* FirebaseRemoteConfig in Frameworks */, CB7FC5462C2AA01F00292A43 /* FacebookCore in Frameworks */, + 82F33EC0D64393B7AAD72A45 /* Pods_relax_offline_mp3_music.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -536,7 +536,7 @@ children = ( CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */, CBD4570C2C2EC38400CE766D /* AppTrackingTransparency.framework */, - 8DB1E9160CFEC3A0E35F11BF /* Pods_relax_offline_mp3_music.framework */, + 10D55D4705A4D9E0F0805527 /* Pods_relax_offline_mp3_music.framework */, ); name = Frameworks; sourceTree = ""; @@ -544,8 +544,8 @@ 96A499915F2622FAB880DA5B /* Pods */ = { isa = PBXGroup; children = ( - EE70E1FE424F9A64CCD389DD /* Pods-relax.offline.mp3.music.debug.xcconfig */, - 5D0F6D7469D3B1668D7B52D9 /* Pods-relax.offline.mp3.music.release.xcconfig */, + 4CEDA702C32CE777A8364913 /* Pods-relax.offline.mp3.music.debug.xcconfig */, + 52181392A4B967D8F80363A1 /* Pods-relax.offline.mp3.music.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -598,7 +598,7 @@ CBAFC9FB2C0A10500054500E /* DataBase */ = { isa = PBXGroup; children = ( - CB4FA4D72C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld */, + CBDC4A272C61B88300960649 /* relax.offline.mp3.xcdatamodeld */, ); path = DataBase; sourceTree = ""; @@ -1217,12 +1217,12 @@ isa = PBXNativeTarget; buildConfigurationList = CBC2D6FF2BFDF3D800E17703 /* Build configuration list for PBXNativeTarget "relax.offline.mp3.music" */; buildPhases = ( - CFEB2643ED606EF96359B55A /* [CP] Check Pods Manifest.lock */, + 0445BFB07A72203603FD6CBA /* [CP] Check Pods Manifest.lock */, CBC2D6E42BFDF3D700E17703 /* Sources */, CBC2D6E52BFDF3D700E17703 /* Frameworks */, CBC2D6E62BFDF3D700E17703 /* Resources */, - B1C37032482F13ACE7C8DA99 /* [CP] Embed Pods Frameworks */, 0018BD0A2C1050F60066717C /* ShellScript */, + 4F340A16CA4CBC1A386EF0AF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -1233,10 +1233,10 @@ CBAFCBAA2C0A10DA0054500E /* FirebaseAnalytics */, CBAFCBAC2C0A10DA0054500E /* FirebaseCrashlytics */, CBAFCBAE2C0A10DA0054500E /* FirebaseRemoteConfig */, - CB000F432C12AD2300B0FC0A /* GoogleMobileAds */, CB7FC5412C2AA01F00292A43 /* FacebookAEM */, CB7FC5432C2AA01F00292A43 /* FacebookBasics */, CB7FC5452C2AA01F00292A43 /* FacebookCore */, + CBDC4A3F2C6219EF00960649 /* GoogleMobileAds */, ); productName = relax.offline.mp3.music; productReference = CBC2D6E82BFDF3D700E17703 /* relax.offline.mp3.music.app */; @@ -1268,8 +1268,8 @@ mainGroup = CBC2D6DF2BFDF3D700E17703; packageReferences = ( CBAFCBA92C0A10DA0054500E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, - CB000F422C12AD2300B0FC0A /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */, CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */, + CBDC4A3E2C6219EF00960649 /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */, ); productRefGroup = CBC2D6E92BFDF3D700E17703 /* Products */; projectDirPath = ""; @@ -1356,24 +1356,7 @@ shellPath = /bin/sh; shellScript = "\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\n"; }; - B1C37032482F13ACE7C8DA99 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - CFEB2643ED606EF96359B55A /* [CP] Check Pods Manifest.lock */ = { + 0445BFB07A72203603FD6CBA /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1395,6 +1378,23 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 4F340A16CA4CBC1A386EF0AF /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-relax.offline.mp3.music/Pods-relax.offline.mp3.music-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1411,6 +1411,7 @@ CBD344DE2C3FD8230095F18F /* MPPositive_GridViewModel.swift in Sources */, CBAFCB622C0A10500054500E /* MPPositive_HomeListFirstCollectionViewCell.swift in Sources */, CBAFCB112C0A10500054500E /* MP_PlayerManager.swift in Sources */, + CBDC4A292C61B88300960649 /* relax.offline.mp3.xcdatamodeld in Sources */, CBAFCB582C0A10500054500E /* MPPositive_LibraryTableViewCell.swift in Sources */, CBAFCB222C0A10500054500E /* MPPositive_JsonSearchTypeResults.swift in Sources */, CBAFCB492C0A10500054500E /* MPPositive_OfflineSongsViewController.swift in Sources */, @@ -1439,7 +1440,6 @@ CBAFCAF52C0A10500054500E /* CoreDataDelegete.swift in Sources */, CBAFCB5B2C0A10500054500E /* MPPositive_ArtistShowCollectionViewCell.swift in Sources */, CBAFCB182C0A10500054500E /* MPPositive_JsonArtistMore.swift in Sources */, - CB4FA4D92C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld in Sources */, CBAFCB982C0A10500054500E /* MPSideA_CustomTabBarItem.swift in Sources */, CBAFCB5D2C0A10500054500E /* MPPositive_ArtistShowListableViewCell.swift in Sources */, CBAFCB7D2C0A10500054500E /* MPSideA_PresentationController.swift in Sources */, @@ -1741,7 +1741,7 @@ }; CBC2D7002BFDF3D800E17703 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EE70E1FE424F9A64CCD389DD /* Pods-relax.offline.mp3.music.debug.xcconfig */; + baseConfigurationReference = 4CEDA702C32CE777A8364913 /* Pods-relax.offline.mp3.music.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1787,7 +1787,7 @@ }; CBC2D7012BFDF3D800E17703 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5D0F6D7469D3B1668D7B52D9 /* Pods-relax.offline.mp3.music.release.xcconfig */; + baseConfigurationReference = 52181392A4B967D8F80363A1 /* Pods-relax.offline.mp3.music.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1855,14 +1855,6 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - CB000F422C12AD2300B0FC0A /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/googleads/swift-package-manager-google-mobile-ads.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 11.5.0; - }; - }; CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/facebook/facebook-ios-sdk"; @@ -1879,14 +1871,17 @@ minimumVersion = 10.27.0; }; }; + CBDC4A3E2C6219EF00960649 /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/googleads/swift-package-manager-google-mobile-ads.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 11.7.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - CB000F432C12AD2300B0FC0A /* GoogleMobileAds */ = { - isa = XCSwiftPackageProductDependency; - package = CB000F422C12AD2300B0FC0A /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */; - productName = GoogleMobileAds; - }; CB7FC5412C2AA01F00292A43 /* FacebookAEM */ = { isa = XCSwiftPackageProductDependency; package = CB7FC5402C2AA01F00292A43 /* XCRemoteSwiftPackageReference "facebook-ios-sdk" */; @@ -1917,17 +1912,22 @@ package = CBAFCBA92C0A10DA0054500E /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; productName = FirebaseRemoteConfig; }; + CBDC4A3F2C6219EF00960649 /* GoogleMobileAds */ = { + isa = XCSwiftPackageProductDependency; + package = CBDC4A3E2C6219EF00960649 /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */; + productName = GoogleMobileAds; + }; /* End XCSwiftPackageProductDependency section */ /* Begin XCVersionGroup section */ - CB4FA4D72C5CDC4A0027C949 /* relax.offline.mp3.xcdatamodeld */ = { + CBDC4A272C61B88300960649 /* relax.offline.mp3.xcdatamodeld */ = { isa = XCVersionGroup; children = ( - CB4FA4D82C5CDC4A0027C949 /* MusicPlayer.xcdatamodel */, + CBDC4A282C61B88300960649 /* MusicPlayer.xcdatamodel */, ); - currentVersion = CB4FA4D82C5CDC4A0027C949 /* MusicPlayer.xcdatamodel */; + currentVersion = CBDC4A282C61B88300960649 /* MusicPlayer.xcdatamodel */; name = relax.offline.mp3.xcdatamodeld; - path = "/Users/zhou/Desktop/纳克斯互娱/relax.offline.mp3.music/relax.offline.mp3.music/MP/Common/DataBase/relax.offline.mp3.xcdatamodeld"; + path = "/Users/zhou/Desktop/纳克斯互娱/MusicLax/relax.offline.mp3.music/MP/Common/DataBase/relax.offline.mp3.xcdatamodeld"; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; }; diff --git a/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved b/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved index 10a552e..9c15645 100644 --- a/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/relax.offline.mp3.music.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -123,8 +123,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads.git", "state" : { - "revision" : "2e4ae78561feac7192c5d8757464546adebb4c7d", - "version" : "11.6.0" + "revision" : "6457f9651bea0d62a548ac63fa9d34aae7d0488e", + "version" : "11.7.0" } }, { diff --git a/relax.offline.mp3.music.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate b/relax.offline.mp3.music.xcworkspace/xcuserdata/zhou.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..46690c1bec5adf99af6e66012830eba2dae98e18 GIT binary patch literal 55034 zcmeEv2V7Lg*7%*7+nb9O5EKINRdLpLxp1kzl%m2*1dnp1w-}`)D{_p!G2H2fD^~{_)=bXEww#pw2rKLU3Ar5nd z<2iv7If+x}Ca(0=1^t1Vd5PY-@@0PbR+1PB)Xq%|ELrX=4+Xn&Xv3B=PnYS%Q+y4+ zirh%0{hZ7xrNtp{$Y-JJqxjXF#_3!yE}DzslDQNvl}qE&xnW!em&pz1vbbz6hnvpL z;EK4J+$^q`E8$AH+1wnil3T|4x#ipnu8OPX8n`vwTJCu61dej2a;I_UaOZLta2Ily za+h;qu93TzyNLO(mJvT$PJ(0&Sx-(Sr;)SB z+2nk35xJCXCRdWHNF&)sc9Gp=4|$M0L>?xOkVnZr@)&uXJVBl$Pm$-yOXOwp3VDaT zOWq@&lF!KJd=%e10Q;0e>NX5x>*f8>AS ze-^Ny2!;?PbQQV@y@Y5XPKX!!2z`aYLaH!A7%hwu@`QY0f-q5-DijGN!dzjVut-=e zED_3uwZiej3BrlONrEL%VV$sEI9WJFI9)hTIA7Q(Y!)sPE*EwPJB3}sZsA(tM&SbSR5iAB_1sf6_dquF-IIBjuej(^Th&jyf{sqF3u3=iSxw;;zIFQu|o8TOT`*7 zAl8Z@akWUr)5NpH^ThMTjp8OTEH;YU#O>k^ai_RTyhgl9yji?Oyj#3SyjQ$WykC4o zd|Z55d`5ghd_{aid{cZ&d{6v`_=)(X__O$n_^bGv_`CRrBuk20k zInue(dD8jPM(G0SLg^xDlhi2fly*tiNY_d?N;gS+rQ4*tq`RfZq{pQvq$j2Q(hJgy z(ihT~(pS>g(l^q#(s$DL(ht&)(ofQFGA|3VC`+;?caeL@J>_0ErtDL8t zuWVE zUtO%0spV>gdc1mqdZK!gYN=FRr><8|R!>nksAs6>s~gqL>SgNX>JD|Mx=Y=yUaQ`y z-l5*9-lN{D-ly(UA5-5}-%;OH-&5aLKTtnZKTD!MBAd>uHB*CsokaBt=*&DtKFyFuRWkWs6DDZt-YYVsJ*1UrM<0v zqJ64;rhTq`t$nZkuKl57UDdnlvHCDQL(kNQ>sflXo}-V@N9xDuqx5n51bw1DNuR0D z(u?&)`eMCIKUS~Mm+7_oaeAE|)I<95`U(0)`X>Ei{Sy6BeY1XXO;I3wQZWArr!7=w&dBhAP$Mi?`VSw^u@Vw4)QjXB0#W1cbJSYVVHON|;MVAL9G zjJ3w`#t8;BPBG3l&N0q4E;cSPZZK{%ZZd8*ZZU2(_8PYtw;OjDcN+H^j~I^{<}d z&l#^8uNki!Zy4_w9~hq-Ul?B+KN>$7e;9w7oQX}rRLm}BH#6SsWA-%@%)#am^C&aL zOgA&lQRZlKoSARVFpJEY<}9<=oNdlC7n)_}Ds#2jV6HLOn#Y?bm?xSinU+b-b>@2W zWb+hrgL$fXnt7&qv3ZGkskzy_%)H#Z!o1SlW?pArZ{A?uXx?PrY~EwuYd&Z`YQAW` zWWH>^V!mp=X1-aPSW{nBb$~NClk38HxNcm}In#?%R`?o%^WkqqdYYYBUgZr2!(0^C z)xs7DbKSWf7Ekd6YfzadF@JbLPFi+mc5>c`f{f(M;koI_IXQX5lJg6P4^Pj|%q+;u zDlGGKpHwh@PM~f@u-04dD+rX=SNm#0?#Qv+0B-0mt~VFQ#dCeQzFY#=kLzyT`Uj$mEo^prIdMkuyOn~6@gWgf`zcS;_^D5 zuV!&`XKnFt1Bx=&q^PjlQulLAV0e>IWuF#h~%8C{DS24@guU+@(QyG z3v<)UJOi6&0Il=9b#uJI+5Vs(Mw#OeEi3ldR95-mNtvfFRLm_8fe_mauD0WOVp_Ti z1ge&J>n6Efm3g9Dp4r1RKa$Hlz0(r1(-P7%Gt&}ax(R9U&-s!)JV9}{Vg#4Z4c*O+ z4so5)S#Cc~yog-wXH zj<-&*EQ?y}VM8{sE%CsdikAgeP4}+!S9$@qPEqsM+&UjXI0|Z&hWu6jklz=a=I;m0!=e5ie*U3|R5dfcJUlqW?SJB)x zC^Qr50`;}d15kg0Wu5`eolFme{N=u&JsJCBb31pjHC&Jzx{V8PwcK%Boz>qOU?o~f z+qe){&#mM_)wNSD7fvrO@B@AXYP@v~ zVW_oX?)2grww~u4|2Fd}4#0teitZSvb7yirw{mA#M{VWKvW{j1jG;`2ZJK~4p2wZf zZ7lP|!rn59P{cIQS-#pjUl7Qbm(9XTwua7#lIJaPwNr!%FPw4a#(Dmbui9QI9AqG% zq1PDQPF%O4Ns<+_q}Cf+HV+PuZ}mifO=z2{=|-8SSDmlQyE-MXbZM2p z#+OoEn~_poAM}@Z{$$p)qS^U@>gqs^himdgbu~Mhuy1v(w}vU%_L4GkA5Aw>&c5Mp zm`HcCv4^I2-hETA=$OOr^6FvGW$(V*{$x4mgb_|Kfs)N=sv~Vk(#C( z>BBl7pz|loxjdjoLC(hwo>^5tc+M}!ujPg;Xkkpjrp)14hY$DLKY$74m|I75K4Q}` zqedTohvBu*;aGF~xHLUCuk%h@K@bQUqvfraP%ysmuwi=Iw(nrXiDr0`*7IQk z{59-a13k_#w->QpIz*?lic1c^)0=*PPG_6pIdePj5y(<*ZSB;+N`Fmmg|`-HZ*uyu zl&qArl(eS#3qUCBfTVPUp{H#(V6erj*z-rCwK zHt%GAAebDiSP_|clYjZ)OdE!%O59P+&P+|`!vs9tKi^VB_)8jQ z^*U`C`@C*VW$J>x@JVT^J+AIB7Uqz%)3y(S;X{dA>r09P6~U%es~Zlx?M350gtlu> z2p=Ec`LsQJ(@7Tn7d9^y`dpv5{bV5Qr*z)!TqdLDd4s;DQ%^hnuxGq6?R$IKsY6fS z56Hg+NRU>yXcL}%QuEEAzP1{&q@mUq%#I9KHoLeiBfX`bEg%$wuwPR-sRG0# z|585)=FT!UbC-dLKD~HaeTYrCMUrdeHZxhymD8@^uHuGn<*u~SwsKpnbS8tw99QqF zYbf$E1rF$8u!T*yjka;SxS@^Qc5Vl^(;8-FSecF7Zf*~EwKd$zvPQE`;+P;d-WzNv z2~4U1(F;VenXKD`PljHRDFzl{GfH%YhaTNb5F2i(`J#)4-YDDUcA%m)7&#fIA$}smV>;9kADp?Akb+@#Mdxa@v2e{|C7q}O>m$;X$vDP>%*UGc*jC5GWEhZU)KoQ0ssXTqUJu}7#|921&@Omx>sBRoOt6JA z`{2SU=v9z6p;;q{)OVB{rYpF8&Z@7ef&TKU0_7`$%)k)Q=VyVI=4chrU-=3UteLvN zBxl>o;I8arpnpTRbN}Ez;XdU)<36_vtqImdYmzm2JNG55Xdw3u_pLPr*3-qBVI9j> z#P-FWG2ogPr2Yz9TPX7+x#hW4ph{OXuo>1A2I{8!Ruy^cLF2F&R^~~EdK0}Xea^|R zs%mii$uBB(RAmOAW&Wy)I-euvJDX)cYpZ?&?nVY50G;O7*FlTWRBwGv`LbeXv9o+j z0pvC1OjB&K?MuIMe}uW;xZka*)--E+=gb4Jv=bF3At@;#-9B#!BLbSBd)$4YMkwLA z4W-kIi+v$`JR~A{E0U}ttL#OjA`R(W7i1ul+lxH#(-n0?-9e0UZBbJL4!$pLp;<+s zUIEmbHTYS9KnRprpHmJktG)i3mg+#FCNW)X#!|P>mS=$Ov*2g3HPc!I8_}Yr+cuF1 zG*iZ}_LbK&LNmT*rN1sv!)#>ED9(y{p}1`*8pQz1>}?fWbF6vRd~4wW)Ccv2wIy(` zqyF<-#w@jGW0e3>%m%$YEupN;yChH-Dq95>r?OgaLsh_A;XpG94FssePPXt8hh*4Y z6nXu1VKj*0?jh^A6B)uLV$Ega&MjHSj$}f54BJtJXrMwg1xz+*0-A^>p~;rdT545V%eJAZV6G}hGb}%ts>-e9j9Bz< zK4Wd{QMSb>Wl}H*_Rca-ze82B(H^MFq3XaXsV@)J*MZ@u69bqtpkv}X9P8Af&15bh z=AuOm5cAM{v;Zx%s;p|O#tLjhi%}Um7J02&D`t1`uBYpWTm7I=#qtYYkIHV{SpTqJ=8JlzhIbMz?jpmdyk$G3;se7 zLcrV|sAF;i5VlZYg|DX2@2jeC>}NKA0;^t~uN(-EW3G!(`98iHCa+cG)rUd>Xv3_5 zEtDo`$sP`_26#(siZ)_mTU{P(u}D)~e4oA@nev*^wogK{4G-G)AF#y|pi$DmgOMt! zPXat2JYee(xEBx{Tlv9rDRT^;m#TOHcTx zwSc;}bW_40*V04#XEs#r-fdMV76g?c;7O7Vmh!3GOz<691Xko4Ftn}%x%WDdi}r(z z^8&~>uYf4SWP;DQuR%EyfMI!n-UES0{m?-0^cVqN9^=5vqX4`)R-m)c`RFF}jH4?w zs}RE?x#X{%C}gcXVRY3D&rJuPbo1Z0 zi*9k$^izL+D=ceaMQzbn?@x5r8rF^0`f8C~xNDynN6);U#?t8jIR zfXV%{-UZ1C2<*{Y(TP^WR%BUg{wYXK29N;nIJB*J?Tjei*A^z8sOWzmCSg$rZCud~ zvITEdJD0COs{qmf_MrAwXSdQS@H_$T3sb>Siy2Dm;CCvxXDx#k_3&vbv{?eB zUifK%?*&k2CHz#u^IE%pDmT~epY`QDuY)$MP6gEV!YsT{&Sp^spH_p#BLH(=3g7&I z-ahzV4LxPpf9qj%KlGLiZI^Sa;AtIvtActBFbmeB4_wJAp$9+oPywZ@;Tv4dz&}6K zUk)SX!MqtfD&X@ZXc@A50W%ns`0e@lV3ZVi!g{H(`&_$OfihY z#ty+8^XyS8Uz09&Tn;$I<#W@(VQwZ|2+oA@CIftCLo2pIuiZl# zxXR6ho3;7ydoJ`p1>EYG6I}_+w-)LxgPlr%(E~7Yg1s+(n7=!I0z7Y-?V)y+?P3s| z@z`mp+O%ze&%4cbhS zgKf=3zmH45oWHyRgm9ew*`;S^ptHcHg3h!~+=|Y&PGYiAKhO^Ait3oER_Ck82WvC@gj6F>v5B{ZYwts^i=4vH&Z@?Oy`cM!^}eE zh!;V(+2sg~J7IJMy3#t?IwcIekzM6G*Z0lMr~14rK;E#mYvA;AXEi^GXyoj+zF9SM zyWW9r;)Y(0cA{NqH`;@)M%SQg(RJv0bOXB4I@LPOI^8zOI@dbSI{#{P zGw2_;qP^%gusGggG{t==K8oU_DK2EoOmNlVmOJEP zxBv`A^d+V@9+l?<<;BPJe{Y>X7^tyL2&Dk<2xOe5j$xro#NGfvFAgaDK|6)`W@AhTYyRa!uh?{UyPY}o|L2h`U2tKt6BeQbNjRzgNjVUuI${#Cq$+Rlk?Yt!vq6Cku%~{Z$qFybO1exo&s^eG5 z1_qj5+zg?qzM4w=lD}1%EirkJb%CQ-J%{!$X!SIVnz#+E3+B(L_0>$O0sn}g2jnN) zjRn1kUgCzrHFAn`bYEpwfY+=`tTMO4o9F|uDWSK}+vpwiE_x5WZ(V9_wl1?Sx2~|R z+<`tsAEA%o_a|^Hud=pK^s99h#l6@8ZL=*=&f;No@aKq_Sh_i76JeVGk)RN4LyICn zg6r}0jH4GYiF%5^roz5KkB3uTUsb`*b`f~1%<_SaFc@N&v9Qan7WF;)8BCk#2lONQ z$=Yg#t;R<53;GqNw$1ts{=t##%D|8tj0_!-+db|%g@-oe!Ae-r05(Z~xm#j`31bwu z6BEp10qpD&ma$@Ox89(r8$~lHI)kE36g_4wd>QN5z$Wg(b-^ASg}dTzxI6BFd*WX3 zDF(-aC|nWo?rEcNPq*D}`Yi?X3A?Re8c4*RdGKNE5@Zh9EtX-RDK)LFBnQ`zYV(wh zv%sA}>8z>H+Wpo-)|#!-)*kCN>key&^*VgI#k#$Xp$Ny}c-#kd#b8*muCsPoH-i0U zr&U_!No`h%+pN(s)wFngG%Lprh!as<7$@O@)^6+SW~&YEW?Mh@0JWJt2X37hfFgzw zoPtxqR&tGXtu@=ekUD@f0PLA~IL_kswqE4CkiQy^jkmhiy573M;>tYpSU)3EQ&Sne z38t=rQ;YwB{%XJI^w8BjWU1Zo2wgU8}=^J~Gd=Gd34 zo2{Dyp8mi&JC@M?1zzq4sc80E)D2R3Nt)0Pb{$9?X_B4oZ2v+!Jyc+wth*KzdWU` zen~?zc#QaK!Lpp(eE67Q$Du9mE~FIsD!sw_U~!`I(!P(GmO{cldZ?B$HQolMXsuxfw1n zodRD~$m{IeK@Z&l&cf$$Jsa`a_#Aw$^`!Nb^>iaXAMRc+u%5A=v-Y!r2DV#N?Li|K z13v`Vr5>VUNuZ&?A7l+%uJ*tz)2>C(U*Q9<$COpfNw5iD3b?x&Uk0}UDfRXKiX{yp zUvP%Ub5;7p0#J@58;RLBluBZ=8wUJdaU)1^{w@t z^``YYMP04059W_g;isGV`q28=`o#LY zh5J2(-vAc(j`c3PqUbTLs4TZ)T42dEZw+96T}qHy20X;&hwtL|pz{0H2iELPoV?tc zAKOgzBgRxCo^9@v&+RAwU{Ap9%`N=~M5+GPryxkdG&*yj^YCu?`eP62?(j%(H;Ex&;U#gvBmZ=GBt@7alOpg+r^xd+ zpR_%#Q-Z+yj})IIM**KCM^nT_7$r#oMoCi9uk42+WPN7;0#@1E-QX-T0!S;#COH%l ziuf=YNsggNph#w1>=3;0FnFmu$T*VE2Fb-cDH4G#kOI7i!aa0*z5rpV+F5S1$z(ck zSu%x8CDSNUC{iiX8p#Y&gfE~-r^xurSuL5vbs=-xv&xMx{qfkNrxnavH+p-;OXaWJ z0IZfQfT|1IS6#jD!;?o=<=%Yl%Rl$cIdF41OHmR<-5Fb(PEmh~65A+#Bt+_6 z#zs*BMLpWEHnJ928+etSKu#nl5sOfYdQuckQ7lEhDT<@0PcwrfD;TR_V>-M7W;@*% zVrHv0JTAgm$mxv3Q54fDi*q?pD+cElwc>1UcbgbnqbUB+e9f(WnKRYChsD;&7RJ^n z>gVvaz5oC7wGQFlqWO`XjI&WRpv?1Mx|n}cH6&M)y^QT$L#`#)k?Y9~|Ji5y@*6b+*&!})D3j1n*N^mNJVtK<#Fpk5q{4LAop z$eIPfbsQTwAH{cvKKQPDH;TqnR2b%a@W7)cP&CCFRP3v%CT!HL zMH4BS6z2Of5o$8){9G~v6y<&&$4QL7I zDPwN7Z39vqjWohA`66bYrKpq{Xb(Fg!EIdX3_Hge_Ta!5x7K`Th5bM`2d{lCiETfm>%7WBbXwjD|13zPEllX7yB#*awK zwXN3dLwZsk=(WzHe5Tiq0KGQTt^_ zicX^7=L6yj{aai)^5P1A31d^2QdAQWSNO|8T;Z>PaGR@mxMU4bR7=ru6kO02Mxk#! zgQIX?Pn64XcJg}|$Jxd2rYJ;FeVD(RzlNff6g3<%nT5ZRzXb-tJNcWf=P6nRdMCe^ z>7A?FG2SSz?9S{i{yvac_`4xs=w6D}P_&k!;~V+=`3IQ9asmbavA^0x&OZiX$m8wB zklP+y^I(^>+*{8-F6!h>$1TVJiG_#Ddj9G5Rnt9p{(R}?NvU_=@$%76Y--%X^!8&M zy*&!;abeNKzrX;vmw%p#F6+Yli~L@S)^`L!M|63Ooe5y{C%1?$Z}IQ4o$khW1-S*J zmoWbx|2{>hP;{y_$Q|e-{u5Ryo{s}*1!R^m|0#b3MH}E4S%W-7+-hI(-?D10PS}kh5wb?%l{6t$}a*ZAc`)c=mLwQ z;86ohfG-;^Br|O_`k-pQ&zLvt=hW4@>W)2p}WKH&Ijvwd7wIlg@pQ?nklTR9U+rF zm$gi>e`gdqrN#BNwGg3j@U3Q>I-OhG+liM#0)ANNFATuFAbf8i6E8P2@p2bM7qczf zN70Uh#Y$VN_1qyR;9L3)){PD zVpgoJuwC6_3yW`fYot{`+9MGsK~cl{JS^0y##ldyNwt_SxTq#^7042MNqPr=&r%?zCjZB&W0q4HIT$&N~a9xC}+lwfb z4d(mG_!)QIy6V2FJJ#n2Ak7HZLDlQqSKW7XqNw^h& zjCTsRFcI(p5CMhTm=E001lewVn9bF85*mdA_T@HVP++grx5Bg4>{=M9kOvDa9d&%Kv&-_*V%vpUZ1GD2l7#zGj7;(_c0Rsj&=;hfq z32@@eOBw-Ad|<8^57rKLdEac5Xtzr(OixrCruRyj=l|Lw9nL7~VlUu~q9K}M7ttd| ziCx8RVt28J*ps5yC;}XMgQ7Pn0wj2wqIW2Im!kJ5dVh}??QljhPK+1(aEW39AH&M3kS{#G%Sq7NgSQ5*)GQOpoC;U|ltk0|=s{{0W&j8}Pv zdh#P=R~#jd1+puS7RONZDMg=!#c^UTMW0jj)e$ofh=t-LHpm2arSSz^X^4~AmByDH zTxmqjf8L#0kyru@Rh%i#5{oHkSU>u!B43y)04&ZrI@G7j(J@C&iA7yE?_Kr{X|aF7K5CA3a6>p>1 zLvd7CyhFT`;;s~Tvr^_n_Gq>Xmd^YUI{}#O5h^|)J_spL+Q9zc&1r;OL=Q9P&_h@2 z*qPs5%A?{wH`)f0Hi}P(Pl6xk!Oo`OV_m)?EI!2s>-Zr!^0;v^WzM?W7}CUN#pfbO z_&mk&6vwzo80Q>?7uivGiGs^&GZMb)AYtz#fQ0XhA3~g)_yNUzw~8N8oWRg53StVH z3!;ZwS#P1j<_*(o%{FdVW6c3;{u~Gb<8z}xragqh6 zbf7h85%k&;Sig{cYsv2Ffv?QiGtFBG1hT%uH?JAe5Opit1lQe|KPA$^a1zfYN+c>OsR_m=XEH>$rPthoVrcwDs|)D zl6p{_M)7cK3B_Zql(|!VOG9j)^Je)gm)W1@JHF*kup2u9&5&!3CW}m5ij(@W(c+~( zQeP>7;&h6KQJg_><~ESdUdMaD%hG^NebEuYde4UFI%YuwF!@$7n@@0-caO*yLYCuxpN&V4Tr?VQnHjHrAld1x-?A6 zkTNOGqBxu49EwL!Jd)yLC>}-eXqLd3{e#rS&Ob-6gmtj!$4CU^(F{0lR*eeqgbxO) zd~9Q;`j^zPNIoYKgB`ZuJn zcrHz%cySf>KDTmsU!vq}5Ub#S3Hb` z=|t{z$&#qFPFgRWD4im00R0G;QhY20{|`RJDy4iH<3A~U*sTaG$h7? zphkzfySxZuofwuzB1@fT_R$W)O$>Xu(8+~eT)xc5@^;5NU)}2hU#Nvv+VPZ$kd+G% z7!rNi$=mESKOwkofDAQu)Gf;|4T+1pxZ^vi!r2s@Pb_&)O(hHkiI-R&qDeJN13>Db zS3Bx>HALRBML>h@&P>{l2X_+(Pmmo=dum-=A*p%Hw5gDcj>QL8K|;HVmgrt*u`Hou zh20xW8G;^J<|a?~JfH+CY6Fn&H)ubD;3df61nJwQi&5Mjfs-zkHcOZB+0qr#mE<^K zpa2eH8!4Vm@mz}MGk+SqkmAL**DG9pybS!Z#WW!8uuTJaPMK%R|Em2X5~wf(d^fU^ zatiGL#E79IwUhJ^t*3ppGwpe0p3DBfnf8R-f|3#+>@DmNV=XDmTF)4QG{M;vFDUcu z`zvP5&Xye!0^y&z0QBsn5t+7E40z6f7Y+EpfOQExXYz(X42hfRJ_rV;vZ*Y^8(U9H zdBhIb>KNVXtPV1rtzMnHnqBiHSNMaFVbNE;q^beJQo;MId_~z(mdbH#)j?U~MrSO^ zUXrzR*od@&cC|uQ3v%@@8=an=k&~H`nVFt8EGIoDV|Y$RW>%{@ka2EwMrK;}l5%fW zT5Dk6=}f2W-<*z{!mHI#&U7-eGlylQr>AG7WoM^nXJ?Jb$Zl1~p3X2|nzv%uur!w* z-y=Q9gqwS%`=tAEEX7`mL1rqqZr>(7Bt0xWB0WlR1;vk1{0~ZOF>{bD!@GIq+fvVz zx%n)Z+BO-MdH($i)scr9BN9?N-A?=DE4I0FOH7`-u&1PF80&nRV&7KjS&A#Il-67D zyt4&M%RD##73bYekek{*SZZ}SlVqxy&AGw}c4k475Pa6^fxF0;q<6uvD7`GbBE2fT zCcQ4bA-yTRCA}@ZL-8_-{S+^!cm>5(6jxJRLveuOT8fX`BfSTV^8@Ka=_Bc5=^xT3 z@a;2->wsV4AjPXFUQIDr7fypWUa_(>nB0-Z=4Ed!%RA_7d|7iDpx;t|Wj&vDT|? z3%-evzt#)yjDwUWZQz)G$eBTCIWTTpYyf8M^ynU>pQT?Mt=TR39hA48Vd)R)Pl`hn z*N0^!BZ^nT|F)9mt*CJNa}uzDNCG7w1wlf$P=iy}Et2-o_0pAPS#ec!kPl=XOlUF) zpAA;o^RmaWmdH_ZSGk+qouw}=nC5IAoF|Hpr+6*JYbXYd{l5`o!Q_(mx*Y%3OOSLx zj+SF&NKDbS?IKzDKgFj|e1a`M$#GypkioQYB8WuJMS`3lCxR$0_mlg}psb%nu|+X$ zl#}Fv@*s-WQM{f))b*g^6~2a&8sJj%%9%xtNqlobNVMN%0$OIPYngoZ${0J9aBf`) zPN0q6K*XonA8gBwoF=Cqv>jo27`Ne|GN*2)Jlx62S>V!&gAs3=oF!+=In46Ha(8xG z&oRstOgp&!A+101NcosH=U5&ik8N9!C&T+>ST+_HriJoEU=;EMiqG6CgXVD-qjj0h znA8#0v{1dgI#BO@b#0JIo+i%%o+?k5XUIh|=qzVbd=ACuQheSvxmYfdOJ$IL&!=Fv z$G1~_2ODoh^LTA~Y#FGT3I%QNoEBlH%rokrwVh>WjR3`cnZLGu^P@X%?x+nd<3vdH zxQ=VLOw^`-pgcIF0A8JQ(0pC6FOrW1lcT&?E~6OqfeXU2R|d)BLW(yrfV2?$mY!NB z(@Yqe8AHn|I;!97(PXP~O>!kD6UF4kMrO7UijFWWBH%PZwo@@g4W+RG`vf?~+o zvz6j)Y;|2Be4)OYrL!svf*J+t7$|VjZ3_$hkoJ->Q+NbUYpv@$%LjYVyyo(S&L{f? zL{8oYaPR~A+8<~HTv0HEOg@DbY@ql`tE_n5_+qE<3|4q1#gI-5vQ3n&t|$jl9Nuxn z5^k|nBh%rBHci5%zzrKDto7Lf+EuRKO5$Dt5JC>~{HT2KpWHPI;FD`rQ<6zVOv9 z=&zBlm9LYpmv5l>8j7!__&SQ=^DRdb^v>$`9t`6l;3BY@|OIz{Eo9JcTs#d z#rL?I@`3!J{E_^z{11xnr5GS`KgADH{K%2tlrIn7ly48-lpk5aPZU4!uWZV1>?Hp# z|3UFX6hF*bb}cMQXiM)J7D5r+ZB?*j{mw2Z1llRQB2WywxeqpASXwg%WDFY?fqDc3 z6jd<**aD~Mww>hhuwp7*D1MUS*VisRCXpD6SAj=ToLUN^!LECpM+(>kX?>7~R0 zcT=L37$sKeP4QC{KTYv76hFI7iC6k4eHE~gKS%L?ikm2Y)h6b)I`@D70#F$OBAap) z#Rpnl04m8!iqKsIG=70%@ZkcY**$Urx6n-ir(`Huuh6Va>s!;veeb{yjz{E1wsmcro+?EQ#4{;=yETYQlu~6j1Mzzlze_P_zi_kq zzk?P`uzzb`anBkT$_tdmu$AI%$|AT(rTG1@Ql@~B^8<=Mv{Gg}3j)&Nthx32=H*s_ z+P@Uoeut0U{wtMbZFg~nQUe1@S4tpbECy?8SP3YgVTz<9@-X-f5!}vi zC<=W$;J%38k&C}iC{Np7N6J&+bwq?iw02t@P~K#?`@Hgk@}lyR^0M-Z@~ZNh^1AW{ zB@!hvB?=`fB^o6`~r|;O=`7-2Dh}mqbNymvn2!-9CTg?veK%RK91p z`vWCiUEKZoP`ImdDmX}lRit7{x>M34tn#WrNl!}Rju`H$s%ir6s+y{+a8PG)KVP_Q{YU*ryIwkGAnuJ&NIL z-+zv;YPt$WsNK?LHABr*hf9~K*=mkDLITUcTuS;;GJujKcK1mJQ8I**qv1Amw>nB4 zt&UO0s^ipLHBZe~3n)pZWC|rdO4d`dm6H1@feCy^dEm3Ht}@g~_EiSy|6dg|)N(ne zPIu;?_;)P&kqGTqiyd$d{I5+L)cS1Cbru6Jy#3E55NZu?Wsi#pgA|e*4XM$Lyp2fY+ zekd6U7tZV#gjAUBR$rj9P($@X^&(0}Q8GHLUaVe1$ruWG_>NSlp?ZbNLJid`)vMGk zl#Hch93{DpY8YRjZlfg6+D{4ix%~%H1|N31;wBYB4b=`p4N+P5Gk*PZvgh7K{FS5l zq+^(91fhm%2cd?O)(3n1K6Ltbn-b)c`W8R&ev4>ylj?*Tsw~uyj1Q}O)!Qg3q+~)n zy~Z}hsCU^JgQKD{1~?A7oa>;g-mgC7$V?A1nQ8K&x^lPparJqI%}=OLs!yp;tIw#< zs?VwW)h6`-B~vMxM#*$aW>8W@$xKRSQBq7v2_>a_)E6Sy{E8DjtiHjpdA5tqkYOnj zJq+0!|F%&0A?@`MO?#?-%Fy{UO6Iue{3W1s$I-*?UjLx}%+UEq^(RW^Q8GWQ{-XX$ z$pT6iF$6mzX-_pyW9k&%sbO}U7lPd0S>$YFTAHF6KmasV(=^bd7gJJ3$+3-^sdZtx zk(ZJsf4Od?_2jx}z1k~09mE=Iu~4;l`>LJB8f$&Dem2%>2@Gp14g+F?v|)g>+F)&n zc9eFsHdIU2QnXYpO#`;Ol#)tHmQmuTWH}`(D5;{Pnvxny0(-O!2WhozC-;$d3`5#l z7il4|Dw6w%obWf&9(f+DO#-CVCR1`;1ZlNtfV3UwK60_6M4JPrLo3y0Qxc>k6xQZy zfV}mTtUY2pSX-`X15~kbnPtYqg9F{?QHEF3VDRdy5hkwp-hyT}{c!l$=5dOz%`mKt?>B zk~1hdlajM2IeU+GZG>vv=;U|RZe>*C9G7aG=jL}Mm;FsN{sTngA$D>ersQ0gXzT-` z(Q$rPcdMV#_QQG5p4FbC_p(eFIg$ zZC|y0R#$iZKWIz<1ETR0BN~^7wO=5mD}jVj?Lp=cjXz=Qb&irNn~8=_bdjNYOI|cx z(q&4nqGU@mJG66Wy|132_tX39 z1N1~aiIOlSjg)|nww;n4lmO}6MagbTz_5Gu9(|BQGxVeNp?WfxsHZZTag9qeZlL6D zO73A7nD_ooG>$yc&_}bA1B&{!5u%|(KHP13o}SNsD7lW3>z&`A@1Nkwa`$_(J`K)< zK1H8O$&HlU6xOHfp#9xU$sI>b+R#gM78$3P>a+DZl-xog!8qC5sL#{qGco|m@9lp% z8PL647rlc72mbZ)oZp_GqMsWV^~O1sudWA;U-v=PrR~W8ydmz9O;;9dzh&orNG|=e zTeHTm`}HaSGTy1LV1)BdP}6mg&I>8ItDVLlH6~}kxPg&CTsJ$mUazla9qiRtF*6Nf5nj1OmLkV|D?oC zTx7uOR69vr6xnM-F?2W_hH7Y(34{L#8-`(0@(Cq&%AzBZ&d=y(^a7MMx*I)=o|Jq_ z$!C;&-e^P{F$`tDpybQH9A%9Ju8YyHJsx(DeaJ|Js!8puw$DD~0(r1uI}_|Qj$$15 zYrw$HQVzK-(v3_TXN?Sov)>*@i;>27Kw9G%W0W!47-Nhz#u>Rro{?`9Q1U$`KTz@` zC182|nUY^90lVvOl>AP~AA5{K2WgGT#uWDcFk?DHTK5HFJfb}KB(oQY@y6dsd*qSU zSO`dKETX*o0x{!QreDL$!`KgP^#U>XY*ZR7ft9h$@KYXBo`j7RMiu3G%Bx3=%NoZS z^$ca}jGz&syg+%8@=~L*(pUv3%gdBk{(6)>5%BP&_ITLAd%%o!P<4I#s_owc<^p+x zaXLf5oyKW^vb@Hu3!S|DtNG1gZqxIO3mn|t2)N6ehiK}yxYXFjaCftDnQ^&sg>j{E zm9fRxYJ`nO%6ljuMIj40yhDZWPWc`b-k`$wqI@*vWA+%^Be=WUarHB<1>EIhBhoRv zM%MbY*b^imX3s<3Ajk_t|J0cz%_W|k}_j9kaAIitUoi_UgICyl2lpFnxYx^#p@WMjVp3Gf?@CgXqshqoW)`%`{EqwylXz<8PRiEyXQ zC$Z6v_-k+v|4!R@6EO0v_857CGV+N>eAC{hY2VMCCti9gXt>6^Q1!j`Ri}KB_1;}4 z=j&JGWL*5)&kLkx4cGY4_y+^>M<62egFr+!K2i5lelRGx?KE7^*Y3`IWw0#$c(3sd zL))W3t2IChDuj0J8o5n=Hh$%LZZ&?P{Lrn&Z3M%ig3EPC<`|m-%QoiA!wDAZ8d=(53^F7njQ#j zvTM4LC1!Us8cu-O!|Z7St;nSOaLQ*jnlWaq*_-m&lpjs`Ty_NdzDy+85rjlddq!F0)Z7x=FtGMp=L6BaXNbsJqxzcp56MHM)_kLAg7vX0OSIQ&>iqD~@JDuTX4x3IEo6Z<}IwMS&%UH_W$(TBu4upAg_j3=JW33To zo{?!88N&;P=NBYrXXfW8XBLjgPtF~YJ|a0cJ!eE={)qgn{LJ(+f9m^!g^|SsAa?bC zuy{z;$bu7d(lgSM;qUOQoXpI$VQE=uY3cbbBiL|qtHNWbnx2zBJS%J1`238tv|-~9 zs_JZaiM`$Fq-SxteK71ZFvlr`)A9{4*<+lV^PNKJ!7na5ySZ?YQ;6$-_~MjSr{!34 z1=n+r={1*_?QT6Z!v z0CA0WC{I_XxOGCSdCiR>fT?w>LT|Od3bI`FXkBP$7|4e-ClJ?q@X_y}WK7E`JgD|z z9k9~KDd~1lV~Bdqob8GdG$Sm=~HCQGN;K%PC($c^|`^o@DfU&egkizbyn26C#hmovw%eo4pg3T@FRx?cb zrIZJSp|)j}+s)k&5@_x)cbdB>UrG68l=nB9d(5lNjg*H|yaE=<*2buM+qJbByQt0| zsIya>vHXFDsF(+dmx_H5TW-@l&yYjccE+%iDGnGH@j9EC;BL_^CZsWKH+eDMywij? z2mC^*+;2X>7zImfFe8fBmef{38jQ5G=Mg5nAWG`oL>5pD z5T2LFQm#Nmd|gRmC{Q~$F|dTaHzo)#P2R8t&hYeNU}BIUEmCQ}td!J2o*WBZ?}^d$ zZr$VJha8nQ@|aNrM(0kNJZ0*%;yH5{mX#*f0INS>m|Z+kUFS|Oj;t@SoaOC+^aRa8 z^+DkN(H5CkTwh-9^HumN4)g$q9@Cr6eFdZsfD8pGkqK>$w)m~FmSA-QCRYgAvR>@d zH=!T!)5N5Kg9bxcv44#Z##&lf<*j6cv?Q2>ULcc{okW01At1dp8~vkB^H`E>iB>N- z*D1N|1v*aZrP4`kj6C242h5{~Ca0tVk9Njw>9_d^#~%Eo)dG8Vwb04DC9{>K5AWSL zEF;rWEY;E)v$At69aNbfRyRoh;dH?k(cBos<>|%wC2S&vJ}*nI2bmin=U!#7Rh4MB zO6jE1Af)+ie$>>{95Zg~Sj)7!v$6BW_YUV50NwS33ny4nR#!G^Z|L3anPp4~)U_n~ zg9SG~wX+&kuw*MsAxV#i^N3B;XB5qx@9Zec$uigZ=(8d3w=+Bd;)aW6!IsRhj}){h zDP26hcv^jk5m02>-hX3v7Xwm-vRbJog$ZZ8E|%$pC?`(WsX7tHFQ6lyP8961}| zMYG`Rv0k9qtxj8oa}L8xpm_)7oXkaWU?Ad#aKpH4ZW1?@o5>Z!+ZF1$&Qoi20mhvkpzY1P!aV?{&{SQt4*y;MGm0(U#Y0#m2 zVwH+R4U8H6lbS4Xt6g)zI47Ym=ZHnGI}(sF^qS!y${e$}Bv9dPNbrUd(z8ZpX2B7O z;req!xpZzMHx`b^Y;Ga9Sed2FReVY{#2=reoUCk6PE*cS&Q&%l7bKG3sP>je3{*z9wq@wb9xbZK1YE zTdtj;oupB1y>^OrD)=;=30_R+f|t=Y@G#m1-bL4F*J(FsH)*$Md$q^4*R`*}g`pRC z5RBBP=?nB_aGAMEZ_wB3C&1+-)z8t-(>LlD>YMaS^v(L^`h9Q<@|)o?`Wq9CQe&}k ztg*zXFqRqtFpvd}dSjK*V4P=cGwv~7Ha-Bo^CROQ#y7_Arf7CEqd}<|WljR&db&B& zEH+C)%4;w;nU|QGd;Zvq>oufTTCaJ%?(Ma&*Biaw@AY-B?|S{v>*rp-_WC_KCVF6W za&&5RdUQtg$mmhgW1`1J=S6#?S4OXk-W+{(^sUkNM?V?;bo8^)`=bv;za9NS^cT@z zMSm0hUG(oUQj8MQGp27$dQ47CZp`GEB{7vTC&gSGvnA$%m`7tiiuo+&=U6dTj#Xpz zSToiW+cmatY`@q6u}QImVu!>Y9h)3GEw(b2#$FzKb?l?D2V&oheLMEu*!N>UjQu$F z+t}}8e~kS(_Se|oWB=^ktM}O6!QL14zO(m3y&voSMDM41Khyi;I4RB(7ax}xcT`+P zTvl98+{n1%xTSIRac9SEiMu=Q-njeY9*lc9?$Nl%;(m)4;>~zZeAoEy@jc_CI-;zKaKi=N++EXuWpn!uBAr3$b z0U;F>0TmF`oTv;%RKzVJq97t5il_vrhz)Jq?%I2=YuuHstE+2V^}Xl$e1CfX53kqr zyxwbXt^MXP!(*YxB9A2=%RE+itn={p*x<3r!^Z>Y5$z%LFnJvDcG16LJne<_qIz+>cwT8<8D3dl zIbL;M&0d3ELtew)>E1%`LT`z8iFcWIxwp}~$NQ-Faqp7=KL7#{0l)$9fG7YN5DgFl zN&#hnazH&m2WSTv0cJoKpc^m-xB$2cxDL1pxCeLucm((z@YQFv55OnP2jdg&v(*RZ zgZCl&kbJiL#Q0Er;(W4wa((iA3VehQ7;56Vbz%@V*AP@)wf`R_PEkG171Q-U40@8s@ zU=ol8C4I4D<~24|oX}0EU5M!BlWOI04K6 zCxVl~Y;X!#3N8i9z;bXUxEfpw-UmJgJ`Mg2d=7j8d>4El{1E&Y`~v(5{2BZe{IB0c zzj=Nu{k;7)_-*p@@vHVz`StkO{f_vZ@w?`C!|#^AhyNyjsDF_EHva_wRR0`*iNDmp z)L-U*&;ObKxc|F=sR6J6Oh9}M z1T+RT1vCd}0$Kxx1Fi&o3S1tD3giS<2lfOW4}2W>GVpca+rYm9zd|NMrb4DeW}vw7~&6!h43LIkV;53q!v;SQA1iFT8Iv!ha83c4P63V3-yJD zK*OMs(CttvGzppsErrUUb>TVi>@Ms+>>=zQ*cbRT_zd_g_#F7Ja4)z&JP;0r!{Nbj zJe&w8!MDR>;Vd`@&V{GKWpFuM1y{pc;9B?~`~dtA{0RK$=AzBjn`<}MZ*D+f5ebM? zL@}ZSQHCf-R3NGlHHbQd0-;2x5LQGl!iKOToQOe$8?hU)7qJg<0C5O$7x8t=+AU#Q zxLfMC3~V{SE zjC3N0kh_q3ko%E`kVlY5k(ZG-kWY{=k*|^OkROm=k>7(R1WgK>5(ElL4w41c1+@n4 z3~~hR3K|Q#7IY)%VbJ5CH$fkQJ_dab`X2NXH3>BZwFtEywG|bKBA`g9XjCjJ4wZmn zqJ*eIR57XqRfZ}@RiGMBdXy1mMp;ljC>zRw>PPKE9Yh^QjiK(M{zQ$VUZdUyPYGTa zyeN1{@Umd<;0?i>f_;KF2P1<~!6Cu4U|w)~a7J)eaCLA?aBFZ|aC=B>2rGmW!VO6a z^$gt}ni!fNDhw?QEetqH9URfaZ&_JrC(?V--lfzYAQ;m|#yBcc044~8BN zy%+i|%p(jP#tTz~4TfC^dySrjUW8tXUV&bP_C|xy{%8mqj^2U}LWiKk&{60ZG!;!l zC!$&C6f_SlNB5xJ=)LHD=mY36^l|h_^l9`>^gZ+o^gHwi^e6Ne%mmD2%rwjl%q$E9 z!^2c#R2U;>5Hp0?hdG70gSm%!h!0JTZ}Ek%CRb}2CKuiW6f9#wg=mXwPT&w zqu3|d=h#27;x;0l7)2x#qlr006|tG9CF+RnL?h8mv=DoUhlpdu zr<>a+wUox2NPYxu9lF?)=If5KRrjp~y3FK7r z4ss?rn_NTIkac7|*|2@vcFOj+?X>NT=;_gmqXE&tXus&dXjn8NIw(3M8XX-Ty)Bv< zogB@MPKoA4r$=W-=S1_P3!;V5;%H6uaP-aSFEMLkurX;d)iFIWM`O;$T!^_Gb2a8( z%(Iw3W5#3N#QYWWA?9PuKe1C{XU5Knogce6c3JGo*wwM2vCP;VvHaMASW#?ItSq)7 zwmP;pwmx<^_8DawWjL)JN1O)MwN`sBfs>s6XN+#7&Bu zAGa`WQQVTab#d$CHpT(s;Bi~xg5rYX;^Vk+X>mK^GUHM4k@1B1sQB%)Uupj(qG?-c zku)NWOpBpWX*3#xmPBLIM6@DWF|CAFMw8R3XtlI@nv$lXsc8eW^R&Mb7A0&>NK7bC z=u9}Aa4+Fm!k-D_39l1ACH$mMqEDsIpwFhyrO&4?q%Wd-($~{B(S7OubO;?zN6@MC zLV6Xwp01>;=o-3?uBRL5c6vX3AAO8|oPLV_8~rl<8vQ2yHvKMR3IooFXRsLA3>ibt zP%zpU4n{v?4`YOJg7F*U9OEM68si4zHsdbiCF2w0Cvy^WDswt>0n?WWW(F{0m{cZ> z$zUciSDsu-@&a7hAGV7TQ%toe~+0HaEJDC>dAk)p<#oWWZ#JtUX&V0cfXTD~B zO`M!KEpcYzoW%Kw%M({6u1)+k(K~TNVq9WX;;zJpiJy{YCoN7|mb5ZybrL9Pa}qKs zI4LX%n>3nqH0ff}wWOO#cak0^{hstJ>5rthNuQDzByUXiPu`v!pDa#RCbuUWl8wn7 z$$iO(laD9gOMb(e&YH!V%bL$x$Xdi&%JN{XW36XxWIXIU3mms!_XcUccuk62Gw&sZPW6WEK`YuFpu z5H^w>%noB?*?4voo6L@3Q`o8OTy`G2lwHHFXDiuF>=w3>ZDw28R(2nIC)>?Fz&^!( z$bQBC$o|a!#{R*X$eG2N!qG+wmVc&*kOwguFstF|U=U=NWlso`q-S_3`Yyex8dr%-h2o z(Vx-A=84>!qTv5Thk)bh-u`s zm^5lyd>S_`H7z|YGksqAs`NGK9_j1SkEEYZznFeG{o0O>9gZFSI|g^SGe8;03{*x) z20G(F#+i&O8P_vzW!%lUpYc57MaHX)w;As<{?1&RNz2q`S~7bwZJCbDflOEC!OX*% zW0}XZBw00C#w>G|C95aPmgUGA$QsJpm9;l(U)IH}D_PgFZf4!dx}WtZ>q*x0tUt5H zvtDO=W^c>R%kIiPnEf$lV@`68D(6_vrJTz-S8}f9JkEKZ^CIU}&R;oy=lqlNC3kkN zNA9LvSS~zwbMBU0Om0LjE*GE6$j!*j&iya3oh#x4`7nM6Kb9ZIPvCR-JbpSqgD>Wn z^2_;^{2G2EU(MI>b$mVF#JBLB{N4Op{Kx#4{4e|;d2{oY=E3qp@)Gled5XNYJbhk! zo-uD{o;}Zz*Ppj9Z-3r_yhC|s^Dg9F&byX(Gw*i(g8Vi48}b49z6kbHE0 zc>cEh$o#7OJ1$zXeg8hQSg42St zf(wF6g1-gdg_DF+g)@Y+gv*2;!c9Vu&|e4vPHR~a#54WAhL=aq5;v6XqRY@XiRiYbW`+5^jh>@^ilL#^j$nbJXt(d z{EK*v*i-B!-XI2uf#S_#q&Qd{CdP`ligDsZaiO?bY!G*dyTsjMr+8587Vi=t6dw^E z6Q2;j5Wg4yBmOG>F8*1#xbW9PpF+RFz(QEz=0Z$iR3W`ExsX%HE6ga&F60;H7nT*4 z7giKj7rrU{Ry3t(deN++xkU?#Ruru+@+ewYw7zI#QG8K#(e9#0MgK_VNR~*JOIAtN zNWhW+2~@IKf|Ot-+a**9O~R0{Bq@?qNxFnD5lhq(n`F0Sk7Tc8RB}>sUUErtRdPde zU-C%uMDkqnXYsP)t;M;;g~i3irNy#hb+M*cSKMA~l1`P*ldh6_O1-2Tq`p$HG(ZZG zBBf+$f;2~3ER{-2q-D|usamR$>ZC@gS!$75r9;w_(lgR?(u>k7((BS&(!0_J(#O)L z(l63~r9Vn0luRm_S~8<#R>_=_`6UZW7M1vykV^_mv?Ze@4@)PPt}8{CCY7d@W|U@^ z=9U(gmX}tPR+ZM2)|Dzs+e%HPou%ESwo*swK&h+rYU#Vu?`2cUrkBksn_ITHY+2dL zvejj4%eIvjm9>|3m$}N0m7OTNPb+Yv`uq;Rx zCd0@gWOx}-MwUg(Sh8%HTvjEkl__M6GPO)2)5+RpCRwL!w`@eVPj*0dNH!)rE;}hZ zEjueaFS{svRX)4iuROY3SZ*jkT>hZ^yL_eGOTIx4ko(G^@?d$W94*JnBjnrU6nTQ2 zDNmMjML{= z_6ldkXvLw5v5I3Arz_4@oUgc8@t|V7;$6l2ijNgvEB>wcSvj$CLFJlC|4K+DymCt= zsxq_^QyEc-t0Yt=RkAC&m1&h3mD!d2%7RK!Wl?2uWo>1BWkaQ^DyRxqg|8x3k*n*g zb=CT6Lv=?@d=0lIwI;nLv*uLIwVE3>w`%UzI%`L3_tze*JyIvGtE|)48SBh-mb#ug zTb-kBpl+ycSKZ#ab9EQ%F4tYHyIyyz?rz=vx`%bY*FCL!UO%~hUH#Vj^!kQ+cm0j} zkBY^L00mMJtO!$J6a)oD5wA#4FcnD(mV%?mRR|Pfg+x)NkSnSbH43}pl;WD=uHu2> zvEr#>T=7QnPVqtUv0-Bat|6~M(ooaT-e7F#X>d23XgJkyt>JdV-G&DZPa2*#yl5D2 z_^O<&oT8kjoT>ap>7n#iZcqZ0U}b<3s)Q>elrhRQWri|a$yXLAMam+jR9U8!E31_4 zN|Vy8>{50sdzCwtPUV1dNI9(Bt-PZAt8q!==0-+id1FuG@x~{r396Z@IjZ@pg{qY* zFVzMWKm}C!sRC3XDy(X&DpEyKMXM;PI8}kFRn@JssqCtLm0Pt-wO2K&I<2~{x~F=m z`d#%*^-A?t^Qj?PQ*={)Q*l#mlcCAf)Y~-Nbh7Dm)Ago1P4}7}Ha%^6-t?kr zyy>fYx_Y(RL%mMDUcE`}s|KqB)KK+iHBwDh$EYdlI5kbpP$#L`>J)XVI$fQiu2J`@ ze^b9|UeFA0rZ*Qgw>9r>KGZzce7yN&^Tp;{&3Bt0G(T>B+WfrvL-Xh6Z_PhiCbvv$ znb|VC1>8btp|vEpa9VgR=`Fb}`7Od0aZ6E)rR7@7$Ce+O*_yQ)PYpl=*FYr`X)b84YHnz5YaVDGYo2PJ zYd&Z`YrbiIXeVo@X=iF@YnN-+Xg#%F+D%$tEm-TX4c5kJsal$rp-s}VwOnnQHba}O zUAW^+W5Y)-SE! zbW?P5bqjQhbW3$BbgOimbReC-4x&Tof^;FeFkPZfrc>&gbsC*cXVi7*x^&$-x9+g+ zr0$IFobICThVHiRp6-F}QQOS6pf+Y3uPwi=s;#E2sm;{pYIC<8Zady~vh7UUg|^FW z*V=BhJ!^Z@_E+2AZJ+d$^)vLd_4D+L^h@F+gY+T#FnyFhMo-n# z^oe?wo}=gL^YqpFI(>s)rEk`2^=*2CzC+)ox9Ugr2lR*ZNAySaC-kTFXZ7dxm-JWk z*Ytn2FKCCh$F)n^JKK-9KQT-)co;Srd<|fOzhR33V~8-|3oPnC6)lnwFYYm{yzCnm{I`iEN57QB5=x z!<1xVo4BSlQ-&$qBsW!=YD{$|g{jfhWNJ2POgfX^WH61GZkoPztm!~^q;)7d>>X!1 zo_D^IY?M^Fs3?v!{8zd6U`K>~Dsc;bw%HVJrCksbryD3b=G$(J5`;U&eqPh&i2looqIa> zcOL9K(s`ouROgw_vz>Q3|LFX;^JmwjuBlx!x@LFH>sr{gxNBM0$}YdIz%FPPybIA4 z)D_Z&?!tC$?ZS28yVAO9BNJtd?HOpk>6e-*U(@W;t#- zX}M~-Ww~p4V0mJBZh2uD@1ED~+l}ZB?Z$LRbmO|o-7($N?)dJ6Zh7~v?(5wTy2rbJ zSSMI#T9;Y@R$nW^8f*=6d!a8n!ZGC6`VEttMZ2e~aZvEM_x+kb7xu?9Rr{`?X z+yBfRs2ATG+Z)%L(97uM_Gb6;d-HpRz2e@Y-s)aOZ)2~zx3yQ_YwYdl9qWD2JKp=g z_hawp-fw-A`lj~H=$q9yrw`Vb)>qr7?(66q>KpDm(08WqUf+Yh@xFI`@B2RXeeL_V z@272|ZGmltZG+9%2D16vV7ARRqzz>w*l4zF8{bx76WNMvQd^l#ZmY7@+7z}P){jmM0{kZ*<{fzyaW3?l~ zL2@u0IS#&~$WiUkI}8q+qu=3jxE*^P`y2-yhaDFjmmK#UzdN2f{&2iH{Oz3V zT;N>fTm6;7qI)v0$HoF=E; zIpo~s-0R%u9CIFbo^t-?Jm-AfzrLT;&**3Mr}U@xXZGjx=k*u#EBjmf&Ha7-uKwZv z1O3PPPxoK$ztexe|7HK%{`dVK`@i;oADA#OX<+rh`hkrD+=1+Y+yUpn=)lo|69cCQ z&JJ7{xH)iV;Qqj)fhPmc2E7N_gAIdw2agP%89X<5eel8H=Sp+!aAmo2UHLAdtI$>KDsk1i%&rmFW!F>J zx1j|?D~J4swhbi=Wez!q+(V~_E)LxpdNTBM==soxp?`;dx+l4(x@Wi-x)-~bxmUW^ zxINqmcdR?d-R16c54wlk``lyhxNs0O~akT-NU`Z{ll)|;o&{QBg2P>PY++(`*82?d&l>F8JRFLePr>-uOr?g z8%KObKqLMmkdd$v>`252ZiFxrH9{VV9ubWgMox^p9r-*uadg(`-2XZ7Nt6D!^B(@c K6aW7iUHyOd_qUM% literal 0 HcmV?d00001 diff --git a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift index 6c0e152..96518e1 100644 --- a/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift +++ b/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_NetWorkManager.swift @@ -527,6 +527,59 @@ extension MP_NetWorkManager { } } } + ///请求歌单排行榜(美国限定) + private func requestChartsUS() { + //拼接出browse路径 + let path = header+point+browse + //设置url + guard let url = URL(string: path) else { + print("Url is Incorrect") + return + } + //异步执行任务 + browseQueque?.sync { + [weak self] in + guard let self = self else { return } + let parameters:[String:Any] = [ + "browseId": "FEmusic_charts", + "prettyPrint":"false", + "context":[ + "client":[ + //web端 + "clientName": "WEB_REMIX", + //当前访问版本(日期值) + "clientVersion": clientVersion, + "platform":"MOBILE", + //语言 + "hl":Language_first_local, + //地址 + "gl":locaton ?? "" + ] + ], + "formData":[ + "selectedValues":["US"] + ] + ] + requestPostChartsUS(url, parameters: parameters) + } + } + ///请求最后的排行数据 + private func requestPostChartsUS(_ url:URL, parameters:Parameters) { + MPSession.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseDecodable(of: JsonCharts.self) { [weak self] (response) in + guard let self = self else {return} + switch response.result { + case .success(let charts): + if let content = charts.contents?.singleColumnBrowseResultsRenderer?.tabs?.first?.tabRenderer?.content?.sectionListRenderer?.contents { + parsingChartsUS(content) + } + case .failure(let error): + print("Failed to parse browses content") + // 请求失败,处理错误 + homeError(error: error) + browseQueque = nil + } + } + } //MARK: - 请求列表专辑预览 /// 向YouTubemusic请求列表/专辑数据,该接口调用的同样是browse预览接口 /// - Parameters: @@ -1625,10 +1678,37 @@ extension MP_NetWorkManager { return } //传递解析数据 + self.browseRequestStateBlock!(browses, false) + requestChartsUS() + } + private func parsingChartsUS(_ contents:[JsonCharts.Contents.SingleColumnBrowseResultsRenderer.Tab.TabRenderer.Content.SectionListRenderer.Content]) { + var browses:[MPPositive_BrowseModuleListViewModel] = [] + contents.forEach { content in + //检索content是否存在二阶段数据 + if let musicCarouselShelfRenderer = content.musicCarouselShelfRenderer { + //存在,继续操作 + let browse = MPPositive_BrowseModuleListViewModel() + browse.title = musicCarouselShelfRenderer.header?.musicCarouselShelfBasicHeaderRenderer?.title?.runs?.first?.text + //获取数据 + musicCarouselShelfRenderer.contents?.forEach({ content in + if let musicTwoRowItemRenderer = content.musicTwoRowItemRenderer, let item = parsingMusicTwoRowItemRenderer(musicTwoRowItemRenderer) { + browse.items.append(.init(item)) + } + }) + browses.append(browse) + } + } + //清理为空的数据 + browses = browses.filter({$0.items.contains(where: {$0.browseItem.pageType == "MUSIC_PAGE_TYPE_PLAYLIST"})}) + guard browseRequestStateBlock != nil else { + return + } + //传递解析数据 self.browseRequestStateBlock!(browses, true) //移除队列 browseQueque = nil } + ///解析预览内容_ContinuationContents private func parsingBrowseContinuationContents(_ continuationContents:JsonBrowses.ContinuationContents) { //获取预览结构体中需要的数据(模块标题;歌曲信息:封面路径,音乐标题,歌手姓名,列表id和视频id) diff --git a/relax.offline.mp3.music/MP/MPPositive/Models/JsonStructs(js文件结构)/MPPositive_JsonCharts.swift b/relax.offline.mp3.music/MP/MPPositive/Models/JsonStructs(js文件结构)/MPPositive_JsonCharts.swift index a41d4d7..343ea60 100644 --- a/relax.offline.mp3.music/MP/MPPositive/Models/JsonStructs(js文件结构)/MPPositive_JsonCharts.swift +++ b/relax.offline.mp3.music/MP/MPPositive/Models/JsonStructs(js文件结构)/MPPositive_JsonCharts.swift @@ -149,14 +149,15 @@ struct JsonCharts: Codable { ///内容模块 struct Content: Codable { let musicResponsiveListItemRenderer:MusicResponsiveListItemRenderer? + let musicTwoRowItemRenderer:RootMusicTwoRowItemRenderer? enum CodingKeys: String, CodingKey { case musicResponsiveListItemRenderer = "musicResponsiveListItemRenderer" - + case musicTwoRowItemRenderer = "musicTwoRowItemRenderer" } init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) musicResponsiveListItemRenderer = try values.decodeIfPresent(MusicResponsiveListItemRenderer.self, forKey: .musicResponsiveListItemRenderer) - + musicTwoRowItemRenderer = try values.decodeIfPresent(RootMusicTwoRowItemRenderer.self, forKey: .musicTwoRowItemRenderer) } struct MusicResponsiveListItemRenderer: Codable { ///封面 diff --git a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift index 638c083..418b29c 100644 --- a/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift +++ b/relax.offline.mp3.music/MP/MPPositive/ViewControllers/Home(首页,各项列表页,艺术家页)/MPPositive_HomeViewController.swift @@ -451,6 +451,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg self.navView.frame = frame } } + func numberOfSections(in tableView: UITableView) -> Int { if MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels.isEmpty { return 1 @@ -471,12 +472,16 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels.isEmpty { - if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, first.browseItem.pageType == "MUSIC_VIDEO_TYPE_ATV" { + switch indexPath.section { + case 0: + let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeLibraryListstableViewCellID, for: indexPath) as! MPPositive_HomeLibraryListstableViewCell + cell.libraryViewModels = MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels + return cell + default: + if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, (first.browseItem.pageType == "MUSIC_VIDEO_TYPE_ATV" || first.browseItem.pageType == "MUSIC_VIDEO_TYPE_UGC") { //是单曲 let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeSinglesTableViewCellID, for: indexPath) as! MPPositive_HomeSinglesTableViewCell cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row] - return cell }else { let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell @@ -546,88 +551,6 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg } return cell } - }else { - switch indexPath.section { - case 0: - let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeLibraryListstableViewCellID, for: indexPath) as! MPPositive_HomeLibraryListstableViewCell - cell.libraryViewModels = MPPositive_BrowseLoadViewModel.shared.libraryList.libraryViewModels - return cell - default: - if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, first.browseItem.pageType == "MUSIC_VIDEO_TYPE_ATV" { - //是单曲 - let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeSinglesTableViewCellID, for: indexPath) as! MPPositive_HomeSinglesTableViewCell - cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row] - - return cell - }else { - let cell = tableView.dequeueReusableCell(withIdentifier: MPPositive_HomeShowTableViewCellID, for: indexPath) as! MPPositive_HomeShowTableViewCell - cell.browseViewModel = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row] - if let first = MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first, first.browseItem.itemType == .single, first.browseItem.pageType == "MUSIC_VIDEO_TYPE_OMV" { - cell.showType = .Fifth - }else { - //判断是列表还是艺术家 - if MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row].items.first?.browseItem.pageType == "MUSIC_PAGE_TYPE_ARTIST" { - cell.showType = .Fourth - }else { - cell.showType = .Third - } - } - cell.requestNextBlock = { - [weak self] (item) in - guard let self = self else {return} - MP_AnalyticsManager.shared.home_b_module_clickAction(item.browseItem.pageType ?? "") - switch item.browseItem.itemType { - case .single: - //单曲/视频跳转 - MPPositive_Debouncer.shared.call { - [weak self] in - guard let self = self else {return} - guard MP_NetWorkManager.shared.netWorkStatu == .reachable else { - MP_HUD.text("Weak connection.", delay: 2.0, completion: nil) - return - } - MP_AnalyticsManager.shared.song_clickAction("Home") - //优先清除数据 - MP_PlayerManager.shared.loadPlayer = nil - //弹出播放器 - NotificationCenter.notificationKey.post(notificationName: .pup_player_vc) - MP_AnalyticsManager.shared.player_b_impAction() - //触发next请求,优先获取列表全部单曲基础数据(不完善) - MP_NetWorkManager.shared.requestNextList(item.browseItem.playListId ?? "", videoId: item.browseItem.videoId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams){ [weak self] listSongs in - guard let self = self else {return} - //回掉的数据并不完善,生成一个playerloadViewModel - let lodaViewModel = MPPositive_PlayerLoadViewModel(listSongs, currentVideoId: item.browseItem.videoId ?? "") - lodaViewModel.improveData(item.browseItem.videoId ?? "") - //更改播放器播放类型 - MP_PlayerManager.shared.setPlayType(.normal) - MP_PlayerManager.shared.loadPlayer = lodaViewModel - MP_AnalyticsManager.shared.player_b_listAction() - } - } - case .list: - isFirstAppearance = false - //列表专辑 - let listVC = MPPositive_ListShowViewController(item.browseItem.browseId ?? "", params: "", title: item.title ?? "", subtitle: item.subtitle ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") - navigationController?.pushViewController(listVC, animated: true) - case .artist: - isFirstAppearance = false - //前往艺术家页面 - let artistVC = MPPositive_ArtistShowViewController(item.browseItem.artistId ?? "", clickTrackingParams: item.browseItem.clickTrackingParams ?? "") - navigationController?.pushViewController(artistVC, animated: true) - default: - break - } - } - cell.findMoreBlock = { - [weak self] in - guard let self = self else {return} - isFirstAppearance = false - let moreVC = MPPositive_MoreContentViewController(MPPositive_BrowseLoadViewModel.shared.browseModuleLists[indexPath.row]) - navigationController?.pushViewController(moreVC, animated: true) - } - return cell - } - } } } }