1"use strict";(globalThis.webpackChunkazurecertprep=globalThis.webpackChunkazurecertprep||[]).push([[817],{80481(e,n,r){r.r(n),r.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"az-104/storage/challenge-05","title":"Challenge 05: Blob Storage & Azure Files","description":"60-75 min | Estimated cost 15-20%","source":"@site/docs/az-104/02-storage/challenge-05.md","sourceDirName":"az-104/02-storage","slug":"/az-104/storage/challenge-05","permalink":"/docs/az-104/storage/challenge-05","draft":false,"unlisted":false,"editUrl":"https://github.com/azurecertprep/azurecertprep.github.io/tree/main/docs/az-104/02-storage/challenge-05.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Challenge 05: Blob Storage & Azure Files"},"sidebar":"az104Sidebar","previous":{"title":"Challenge 04: Storage Accounts & Access","permalink":"/docs/az-104/storage/challenge-04"},"next":{"title":"Challenge 06: Storage Security & Lifecycle","permalink":"/docs/az-104/storage/challenge-06"}}');var t=r(74848),i=r(28453),a=r(80892),l=r(4865),o=r(19365);const c={sidebar_position:2,title:"Challenge 05: Blob Storage & Azure Files"},d="Challenge 05: Blob Storage & Azure Files",h={},u=[{value:"Introduction",id:"introduction",level:2},{value:"Exam skills covered",id:"exam-skills-covered",level:2},{value:"Sysadmin \u2194 Azure reference",id:"sysadmin--azure-reference",level:2},{value:"Description",id:"description",level:2},{value:"Part 1: set up the environment",id:"part-1-set-up-the-environment",level:3},{value:"Part 2: Blob Containers & access tiers",id:"part-2-blob-containers--access-tiers",level:3},{value:"Part 3: soft delete for blobs & Containers",id:"part-3-soft-delete-for-blobs--containers",level:3},{value:"Part 4: Blob versioning",id:"part-4-blob-versioning",level:3},{value:"Part 5: Blob snapshots",id:"part-5-blob-snapshots",level:3},{value:"Part 6: Azure Files | create & configure",id:"part-6-azure-files--create--configure",level:3},{value:"Part 7: file share snapshots & soft delete",id:"part-7-file-share-snapshots--soft-delete",level:3},{value:"Success criteria",id:"success-criteria",level:2},{value:"Hints",id:"hints",level:2},{value:"Learning resources",id:"learning-resources",level:2},{value:"Break & fix",id:"break--fix",level:2},{value:"Knowledge check",id:"knowledge-check",level:2},{value:"Cleanup",id:"cleanup",level:2}];function x(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components},{Details:r}=n;return r||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"challenge-05-blob-storage--azure-files",children:"Challenge 05: Blob Storage & Azure Files"})}),"\n",(0,t.jsx)(n.admonition,{title:"Estimated Time and Cost",type:"info",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"60-75 min"})," | ",(0,t.jsx)(n.strong,{children:"Estimated cost"}),": ~$0.50 | ",(0,t.jsx)(n.strong,{children:"Exam Weight: 15-20%"})]})}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsx)(n.p,{children:"Contoso's application team stores user profile images, log files, and reports in Azure. Meanwhile, the finance team needs a shared file system they can mount from their Windows desktops | just like the on-prem file server they're used to. You need to set up both Blob Storage (for app data) and Azure Files (for the finance team's shared drive)."}),"\n",(0,t.jsx)(n.p,{children:"Understanding the difference between Blob Storage and Azure Files | and when to use each | is critical for the AZ-104 exam. This challenge gives you hands-on experience with both."}),"\n",(0,t.jsx)(n.h2,{id:"exam-skills-covered",children:"Exam skills covered"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Create and configure blob containers"}),"\n",(0,t.jsx)(n.li,{children:"Create and configure file shares"}),"\n",(0,t.jsx)(n.li,{children:"Configure storage tiers (Hot, Cool, Archive)"}),"\n",(0,t.jsx)(n.li,{children:"Configure soft delete for blobs and containers"}),"\n",(0,t.jsx)(n.li,{children:"Configure blob snapshots and versioning"}),"\n",(0,t.jsx)(n.li,{children:"Configure soft delete for Azure Files"}),"\n",(0,t.jsx)(n.li,{children:"Configure file share snapshots"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"sysadmin--azure-reference",children:"Sysadmin \u2194 Azure reference"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"On-Prem / Sysadmin"}),(0,t.jsx)(n.th,{children:"Azure Equivalent"}),(0,t.jsx)(n.th,{children:"Notes"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Application data folder"}),(0,t.jsx)(n.td,{children:"Blob container"}),(0,t.jsx)(n.td,{children:"Unstructured data (images, logs, backups)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SMB file share (\\server\\share)"}),(0,t.jsx)(n.td,{children:"Azure Files share"}),(0,t.jsx)(n.td,{children:"Mountable via SMB 3.0 on Windows/Linux/macOS"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Volume Shadow Copy"}),(0,t.jsx)(n.td,{children:"Blob snapshots / File share snapshots"}),(0,t.jsx)(n.td,{children:"Point-in-time recovery"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Recycle Bin"}),(0,t.jsx)(n.td,{children:"Soft delete"}
1),(0,t.jsx)(n.td,{children:"Recoverable deletion (configurable retention)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"File versioning (DFS)"}),(0,t.jsx)(n.td,{children:"Blob versioning"}),(0,t.jsx)(n.td,{children:"Automatic version history"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Tape archive / offsite storage"}),(0,t.jsx)(n.td,{children:"Archive tier"}),(0,t.jsx)(n.td,{children:"Lowest cost, hours to retrieve"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SAN / direct-attached storage"}),(0,t.jsx)(n.td,{children:"Premium file shares"}),(0,t.jsx)(n.td,{children:"SSD-backed, low latency"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"description",children:"Description"}),"\n",(0,t.jsx)(n.h3,{id:"part-1-set-up-the-environment",children:"Part 1: set up the environment"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Create a resource group and storage account:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'RG="rg-az104-challenge05"\nLOCATION="eastus"\nSTORAGE_NAME="stblobfiles$RANDOM"\n\naz group create --name $RG --location $LOCATION\n\naz storage account create \\\n --name $STORAGE_NAME \\\n --resource-group $RG \\\n --location $LOCATION \\\n --sku Standard_LRS \\\n --kind StorageV2 \\\n --access-tier Hot\n\n# Save the connection string\nCONN_STRING=$(az storage account show-connection-string --name $STORAGE_NAME --resource-group $RG -o tsv)\n'})}),"\n",(0,t.jsx)(n.h3,{id:"part-2-blob-containers--access-tiers",children:"Part 2: Blob Containers & access tiers"}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsx)(n.li,{children:"Create three blob containers with different access levels:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'# Private (default): no anonymous access\naz storage container create --name app-data --connection-string "$CONN_STRING"\n\n# Private: for sensitive logs\naz storage container create --name logs --connection-string "$CONN_STRING"\n\n# Private: for archived reports\naz storage container create --name archive --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"3",children:["\n",(0,t.jsxs)(n.li,{children:["Create test files and upload blobs to the ",(0,t.jsx)(n.code,{children:"app-data"})," container:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "User profile data for Alice" > profile-alice.txt\necho "User profile data for Bob" > profile-bob.txt\necho "Application log entry 2025-01-15" > app-log-2025-01-15.txt\n\naz storage blob upload --container-name app-data --file profile-alice.txt --name profiles/alice.txt --connection-string "$CONN_STRING"\naz storage blob upload --container-name app-data --file profile-bob.txt --name profiles/bob.txt --connection-string "$CONN_STRING"\naz storage blob upload --container-name logs --file app-log-2025-01-15.txt --name 2025/01/app-log-2025-01-15.txt --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Change a blob's access tier from Hot to Cool:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage blob set-tier \\\n --container-name logs \\\n --name "2025/01/app-log-2025-01-15.txt" \\\n --tier Cool \\\n --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsxs)(n.li,{children:["Upload a file to the ",(0,t.jsx)(n.code,{children:"archive"})," container and set it to Archive tier:"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "Quarterly Report Q3 2024" > q3-report.txt\naz storage blob upload --container-name archive --file q3-report.txt --name reports/q3-2024.txt --connection-string "$CONN_STRING" --tier Archive\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsx)(n.li,{children:"Verify the access tiers:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage blob list --container-name app-data --connection-string "$CONN_STRING" \\\n --query "[].{Name:name, Tier:properties.blobTier}" -o table\n\naz storage blob list --container-name logs --connection-string "$CONN_STRING" \\\n --query "[].{Name:name, Tier:properties.blobTier}" -o table\n\naz storage blob list --container-name archive --connection-string "$CONN_STRING" \\\n --query "[].{Name:name, Tier:properties.blobTier}" -o table\n'})}),"\n",(0,t.jsx)(n.h3,{id:"part-3-soft-delete-for-blobs--containers",children:"Part 3: soft delete for blobs & Containers"}),"\n",(0,t.jsxs)(n.ol,{start:"7",children:["\n",(0,t.jsx)(n.li,{children:"Enable soft delete for blobs with a 14-d
1ay retention period:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"az storage account blob-service-properties update \\\n --account-name $STORAGE_NAME \\\n --resource-group $RG \\\n --enable-delete-retention true \\\n --delete-retention-days 14\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"8",children:["\n",(0,t.jsx)(n.li,{children:"Enable soft delete for containers:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"az storage account blob-service-properties update \\\n --account-name $STORAGE_NAME \\\n --resource-group $RG \\\n --enable-container-delete-retention true \\\n --container-delete-retention-days 14\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsx)(n.li,{children:"Test soft delete | delete a blob and then recover it:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'# Delete the blob\naz storage blob delete --container-name app-data --name profiles/alice.txt --connection-string "$CONN_STRING"\n\n# List deleted blobs (include soft-deleted)\naz storage blob list --container-name app-data --connection-string "$CONN_STRING" --include d \\\n --query "[?deleted].{Name:name, Deleted:deleted}" -o table\n\n# Undelete the blob\naz storage blob undelete --container-name app-data --name profiles/alice.txt --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsx)(n.h3,{id:"part-4-blob-versioning",children:"Part 4: Blob versioning"}),"\n",(0,t.jsxs)(n.ol,{start:"10",children:["\n",(0,t.jsx)(n.li,{children:"Enable blob versioning:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"az storage account blob-service-properties update \\\n --account-name $STORAGE_NAME \\\n --resource-group $RG \\\n --enable-versioning true\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"11",children:["\n",(0,t.jsx)(n.li,{children:"Test versioning by uploading a modified version of the same blob:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "Updated profile data for Alice | version 2" > profile-alice-v2.txt\naz storage blob upload --container-name app-data --file profile-alice-v2.txt --name profiles/alice.txt --connection-string "$CONN_STRING" --overwrite\n\n# List versions\naz storage blob list --container-name app-data --connection-string "$CONN_STRING" --include v \\\n --query "[?name==\'profiles/alice.txt\'].{Name:name, VersionId:versionId, IsCurrentVersion:isCurrentVersion}" -o table\n'})}),"\n",(0,t.jsx)(n.h3,{id:"part-5-blob-snapshots",children:"Part 5: Blob snapshots"}),"\n",(0,t.jsxs)(n.ol,{start:"12",children:["\n",(0,t.jsx)(n.li,{children:"Create a snapshot of a blob:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage blob snapshot --container-name app-data --name profiles/bob.txt --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"13",children:["\n",(0,t.jsx)(n.li,{children:"List snapshots:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage blob list --container-name app-data --connection-string "$CONN_STRING" --include s \\\n --query "[?snapshot!=null].{Name:name, Snapshot:snapshot}" -o table\n'})}),"\n",(0,t.jsx)(n.h3,{id:"part-6-azure-files--create--configure",children:"Part 6: Azure Files | create & configure"}),"\n",(0,t.jsxs)(n.ol,{start:"14",children:["\n",(0,t.jsx)(n.li,{children:"Create an Azure File share for the finance team:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"az storage share-rm create \\\n --storage-account $STORAGE_NAME \\\n --resource-group $RG \\\n --name finance-share \\\n --quota 50\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"15",children:["\n",(0,t.jsx)(n.li,{children:"Create directories and upload files to the file share:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage directory create --share-name finance-share --name "reports" --connection-string "$CONN_STRING"\naz storage directory create --share-name finance-share --name "invoices" --connection-string "$CONN_STRING"\n\necho "Budget Report 2025" > budget-2025.txt\naz storage file upload --share-name finance-share --source budget-2025.txt --path "reports/budget-2025.txt" --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"16",children:["\n",(0,t.jsx)(n.li,{children:"Show how to mount the file share on Windows:"}),"\n"]}),"\n",(0,t.jsxs)(l.A,{children:[(0,t.jsx)(o.A,{value:"windows",label:"Windows (CMD)",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cmd",children:"REM Get the storage account key\nREM Replace <storage-account-name> and <storage-account-key> with your values\n\nnet use Z: \\\\<storage-account-name>.file.core.windows.net\\finance-share /u:AZURE\\<storage-account-name> <storage-account-key>\n"})})}),(0,t.jsx)(o.A,{value:"linux",label:"Linux",children:(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Install cifs-utils if not installed\nsudo apt-get install cifs-utils\n\n# Create mount point\nsudo mkdir -p /mnt/finance-share\n\n# Mount the file share\nsudo mount -t cifs //$STORAGE_NAME.file.core.windows.net/finance-share /mnt/finance-share \\\n -o vers=3.0,username=$STORAGE_NAME,password=<storage-account-key>,dir_mode=0777,file_mode=0777\n"})})}),(0,t.jsx)(o.A,{value:"portal",label:"Portal (Connect Script)",children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Go to your ",(0,t.jsx)(n.strong,{children:"Storage account"})," \u2192 ",(0,t.jsx)(n.strong,{children:"File shares"})," \u2192 ",(0,t.jsx)(n.strong,{children:"finance-share"})]}),"\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Connect"})]}),"\n",(0,t.jsx)(n.li,{children:"Select your OS (Windows / Linux / macOS)"}),"\n",(0,t.jsx)(n.li,{children:"Copy and run the auto-generated mount script"}),"\n"]})})]}
1),"\n",(0,t.jsx)(n.h3,{id:"part-7-file-share-snapshots--soft-delete",children:"Part 7: file share snapshots & soft delete"}),"\n",(0,t.jsxs)(n.ol,{start:"17",children:["\n",(0,t.jsx)(n.li,{children:"Enable soft delete for Azure Files:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"az storage account file-service-properties update \\\n --account-name $STORAGE_NAME \\\n --resource-group $RG \\\n --enable-delete-retention true \\\n --delete-retention-days 14\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"18",children:["\n",(0,t.jsx)(n.li,{children:"Create a file share snapshot:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage share snapshot --name finance-share --connection-string "$CONN_STRING"\n'})}),"\n",(0,t.jsxs)(n.ol,{start:"19",children:["\n",(0,t.jsx)(n.li,{children:"List snapshots:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'az storage share list --connection-string "$CONN_STRING" --include-snapshots \\\n --query "[?name==\'finance-share\'].{Name:name, Snapshot:snapshot}" -o table\n'})}),"\n",(0,t.jsx)(n.h2,{id:"success-criteria",children:"Success criteria"}),"\n",(0,t.jsx)(a.A,{storageKey:"az104-challenge-05",items:["Three blob containers exist: app-data, logs, archive","Blobs uploaded with correct virtual directory structure (profiles/, 2025/01/)","Log blob tier changed from Hot to Cool","Archive blob uploaded directly to Archive tier","Blob soft delete enabled (14-day retention)","Container soft delete enabled (14-day retention)","Successfully deleted and recovered a blob using soft delete","Blob versioning enabled and multiple versions of a blob exist","A blob snapshot has been created","Azure File share finance-share exists with directories and files","File share snapshot created","Azure Files soft delete enabled"]}),"\n",(0,t.jsx)(n.h2,{id:"hints",children:"Hints"}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Hint 1: Understanding access tiers"}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Tier"}),(0,t.jsx)(n.th,{children:"Storage Cost"}),(0,t.jsx)(n.th,{children:"Access Cost"}),(0,t.jsx)(n.th,{children:"Retrieval Time"}),(0,t.jsx)(n.th,{children:"Min Retention"}),(0,t.jsx)(n.th,{children:"Use Case"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Hot"})}),(0,t.jsx)(n.td,{children:"Highest"}),(0,t.jsx)(n.td,{children:"Lowest"}),(0,t.jsx)(n.td,{children:"Instant"}),(0,t.jsx)(n.td,{children:"None"}),(0,t.jsx)(n.td,{children:"Frequently accessed data"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Cool"})}),(0,t.jsx)(n.td,{children:"Lower"}),(0,t.jsx)(n.td,{children:"Higher"}),(0,t.jsx)(n.td,{children:"Instant"}),(0,t.jsx)(n.td,{children:"30 days"}),(0,t.jsx)(n.td,{children:"Infrequent access (monthly)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Cold"})}),(0,t.jsx)(n.td,{children:"Even lower"}),(0,t.jsx)(n.td,{children:"Even higher"}),(0,t.jsx)(n.td,{children:"Instant"}),(0,t.jsx)(n.td,{children:"90 days"}),(0,t.jsx)(n.td,{children:"Rarely accessed"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Archive"})}),(0,t.jsx)(n.td,{children:"Lowest"}),(0,t.jsx)(n.td,{children:"Highest"}),(0,t.jsx)(n.td,{children:"Hours (1-15h)"}),(0,t.jsx)(n.td,{children:"180 days"}),(0,t.jsx)(n.td,{children:"Long-term backup, compliance"})]})]})]}),(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Early deletion penalty"}),": If you delete or move a blob from Cool/Archive before the minimum retention period, you're charged as if you kept it for the full period. For example, deleting a blob from Cool after 10 days = charged for 30 days."]})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Hint 2: Blob versioning vs. snapshots"}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Feature"}),(0,t.jsx)(n.th,{children:"Versioning"}),(0,t.jsx)(n.th,{children:"Snapshots"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Trigger"})}),(0,t.jsx)(n.td,{children:"Automatic on every write"}),(0,t.jsx)(n.td,{children:"Manual (you create them)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Scope"})}),(0,t.jsx)(n.td,{children:"Individual blob"}),(0,t.jsx)(n.td,{children:"Individual blob"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Identification"})}),(0,t.jsx)(n.td,{children:"VersionId (timestamp-based)"}),(0,t.jsx)(n.td,{children:"Snapshot timestamp"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Mutable"})}),(0,t.jsx)(n.td,{children:"No (versions are immutable)"}
1),(0,t.jsx)(n.td,{children:"No (snapshots are read-only)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Deletable"})}),(0,t.jsx)(n.td,{children:"Yes (delete specific versions)"}),(0,t.jsx)(n.td,{children:"Yes (delete specific snapshots)"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Use case"})}),(0,t.jsx)(n.td,{children:"Audit trail, automatic history"}),(0,t.jsx)(n.td,{children:"Point-in-time backup"})]})]})]}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Exam tip"}),": Versioning is the modern, recommended approach. Snapshots are legacy but still tested."]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Hint 3: Rehydrating an archived blob"}),(0,t.jsxs)(n.p,{children:["Archived blobs cannot be read directly. You must first ",(0,t.jsx)(n.strong,{children:"rehydrate"})," them:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'# Change tier from archive to hot (standard priority: up to 15 hours)\naz storage blob set-tier \\\n --container-name archive \\\n --name reports/q3-2024.txt \\\n --tier Hot \\\n --connection-string "$CONN_STRING"\n\n# High priority rehydration (faster, more expensive: under 1 hour for < 10 gb)\naz storage blob set-tier \\\n --container-name archive \\\n --name reports/q3-2024.txt \\\n --tier Hot \\\n --rehydrate-priority High \\\n --connection-string "$CONN_STRING"\n'})})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Hint 4: Azure Files | SMB port requirements"}),(0,t.jsxs)(n.p,{children:["Azure Files uses ",(0,t.jsx)(n.strong,{children:"SMB 3.0"})," over ",(0,t.jsx)(n.strong,{children:"TCP port 445"}),". Many ISPs and corporate firewalls block this port."]}),(0,t.jsx)(n.p,{children:"To check if port 445 is open:"}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:"Test-NetConnection -ComputerName <storage-account>.file.core.windows.net -Port 445\n"})}),(0,t.jsx)(n.p,{children:"If port 445 is blocked, alternatives include:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Azure VPN Gateway"})," (connect via VPN)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Azure File Sync"})," (sync to on-prem server)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"REST API"})," (programmatic access, no SMB needed)"]}),"\n"]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"Hint 5: Blob vs. Azure Files decision guide"}),(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Scenario"}),(0,t.jsx)(n.th,{children:"Use"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"App stores/reads unstructured data (images, logs)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Blob Storage"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Users need a mapped drive (Z:)"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Azure Files"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Streaming media or CDN origin"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Blob Storage"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Lift-and-shift of on-prem file server"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Azure Files"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Data lake for analytics"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Blob Storage (Data Lake Gen2)"})})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Shared config files across VMs"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.strong,{children:"Azure Files"})})]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"learning-resources",children:"Learning resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-overview",children:"Azure Blob Storage overview"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us
1/azure/storage/blobs/access-tiers-overview",children:"Access tiers for blob data"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/storage/blobs/soft-delete-blob-overview",children:"Soft delete for blobs"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/storage/blobs/versioning-overview",children:"Blob versioning"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/storage/files/storage-files-introduction",children:"Azure Files overview"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/azure/storage/files/storage-files-planning",children:"Azure Files planning guide"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"break--fix",children:"Break & fix"}),"\n",(0,t.jsx)(n.p,{children:"After completing the challenge, try these troubleshooting scenarios:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Archived blob surprise"}),": Try to download the blob you set to Archive tier. What error do you get? (",(0,t.jsx)(n.code,{children:"BlobArchived"})," | you must rehydrate first.) How long does standard rehydration take?"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Soft delete confusion"}),": Delete a blob, then delete the same blob again after recreating it. How many soft-deleted versions exist? Can you recover a specific one?"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"File share mount failure"}),": Try to mount the Azure File share from a network where port 445 is blocked. What error do you see? What are the workaround options?"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Snapshot vs. versioning overlap"}),": Enable both versioning and snapshots on the same container. Upload a file, create a snapshot, then overwrite the file. How many copies exist now? (Original version, snapshot of original, and new current version = 3 copies.)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"knowledge-check",children:"Knowledge check"}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"1. What is the cost difference between Hot, Cool, and Archive tiers?"}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Storage costs"})," (per GB/month, approximate for LRS in East US):"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Hot: ~$0.018/GB"}),"\n",(0,t.jsx)(n.li,{children:"Cool: ~$0.010/GB"}),"\n",(0,t.jsx)(n.li,{children:"Archive: ~$0.002/GB"}),"\n"]}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Access costs"})," (per 10,000 read operations):"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Hot: ~$0.004"}),"\n",(0,t.jsx)(n.li,{children:"Cool: ~$0.01"}),"\n",(0,t.jsx)(n.li,{children:"Archive: ~$5.00 (plus rehydration cost)"}),"\n"]}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Key insight"}),": Archive is 9x cheaper to store but 1,250x more expensive to read. Only use it for data you rarely need to access."]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"2. When should you use Blob Storage vs. Azure Files?"}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Use Blob Storage when"}),":"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Applications access data via REST API or SDKs"}),"\n",(0,t.jsx)(n.li,{children:"You need scalable storage for unstructured data (images, videos, logs)"}),"\n",(0,t.jsx)(n.li,{children:"You want to use access tiers (Hot/Cool/Archive)"}),"\n",(0,t.jsx)(n.li,{children:"You're building a data lake"}),"\n"]}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Use Azure Files when"}),":"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Applications use standard file system APIs (SMB/NFS)"}),"\n",(0,t.jsx)(n.li,{children:"You need a shared file system across multiple VMs"}),"\n",(0,t.jsx)(n.li,{children:'You\'re migrating an on-prem file server ("lift and shift")'}
1),"\n",(0,t.jsx)(n.li,{children:"You need POSIX-compliant file access"}),"\n"]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"3. What is the maximum size of an Azure File share?"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Standard file shares"}),": Up to ",(0,t.jsx)(n.strong,{children:"100 TiB"})," (with large file shares enabled; default is 5 TiB)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Premium file shares"}),": Up to ",(0,t.jsx)(n.strong,{children:"100 TiB"})," (provisioned capacity model)"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Maximum file size"}),": 4 TiB per individual file"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Maximum directory depth"}),": No practical limit, but the full path cannot exceed 2,048 characters"]}),"\n"]})]}),"\n",(0,t.jsxs)(r,{children:[(0,t.jsx)("summary",{children:"4. Can you change a blob's tier without re-uploading it?"}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Yes!"})," You can change the tier of an existing blob at any time using:"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Azure Portal (blob properties)"}),"\n",(0,t.jsxs)(n.li,{children:["Azure CLI: ",(0,t.jsx)(n.code,{children:"az storage blob set-tier"})]}),"\n",(0,t.jsx)(n.li,{children:"REST API / SDKs"}),"\n"]}),(0,t.jsxs)(n.p,{children:["Tier changes from ",(0,t.jsx)(n.strong,{children:"Archive"})," require ",(0,t.jsx)(n.strong,{children:"rehydration"}),", which can take hours. Changes between ",(0,t.jsx)(n.strong,{children:"Hot"}),", ",(0,t.jsx)(n.strong,{children:"Cool"}),", and ",(0,t.jsx)(n.strong,{children:"Cold"})," tiers are instantaneous."]}),(0,t.jsxs)(n.p,{children:["Note: Changing tier incurs a ",(0,t.jsx)(n.strong,{children:"write operation charge"})," at the destination tier's rate, plus an early deletion fee if the blob hasn't met the minimum retention period for its current tier."]})]}),"\n",(0,t.jsx)(n.h2,{id:"cleanup",children:"Cleanup"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# Delete the resource group (removes storage account and all data)\naz group delete --name rg-az104-challenge05 --yes --no-wait\n\n# Clean up local files\nrm -f profile-alice.txt profile-bob.txt profile-alice-v2.txt app-log-2025-01-15.txt q3-report.txt budget-2025.txt\n"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Next"}),": ",(0,t.jsx)(n.a,{href:"/docs/az-104/storage/challenge-06",children:"Challenge 06 | Storage Security & Lifecycle"})]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(x,{...e})}):x(e)}},19365(e,n,r){r.d(n,{A:()=>o});r(96540);var s=r(34164),t=r(47751);const i="tabItem_Ymn6";var a=r(74848);function l({children:e,className:n,hidden:r}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(i,n),hidden:r,children:e})}function o({children:e,className:n,value:r}){const{selectedValue:s,lazy:i}=(0,t.uc)(),o=r===s;return!o&&i?null:(0,a.jsx)(l,{className:n,hidden:!o,children:e})}},4865(e,n,r){r.d(n,{A:()=>p});r(96540);var s=r(34164),t=r(17559),i=r(47751),a=r(23104),l=r(92303);const o="tabList__CuJ",c="tabItem_LNqP";var d=r(74848);function h({className:e}){const{selectedValue:n,selectValue:r,tabValues:t,block:l}=(0,i.uc)(),o=[],{blockElementScrollPositionUntilNextRender:h}=(0,a.a_)(),u=e=>{const s=e.currentTarget,i=o.indexOf(s),a=t[i].value;a!==n&&(h(s),r(a))},x=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,d.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":l},e),children:t.map(({value:e,label:r,attributes:t})=>(0,d.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{o.push(e)},onKeyDown:x,onClick:u,...t,className:(0,s.A)("tabs__item",c,t?.className,{"tabs__item--active":n===e}),children:r??e},e))})}function u({children:e}){return(0,d.jsx)("div",{className:"margin-top--md",children:e})}function x({className:e,children:n}){return(0,d.jsxs)("div",{className:(0,s.A)(t.G.tabs.container,"tabs-container",o),children:[(0,d.jsx)(h,{className:e}),(0,d.jsx)(u,{children:n})]})}function p(e){const n=(0,l.A)(),r=(0,i.OC)(e);return(0,d.jsx)(i.O_,{value:r,children:(0,d.jsx)(x,{className:e.className,children:(0,i.vT)(e.children)})},String(n))}},47751(e,n,r){r.d(n,{OC:()=>p,O_:()=>b,uc:()=>j,vT:()=>d});var s=r(96540),t=r(56347),i=r(205),a=r(57485),l=r(70679),o=r(31682),c=r(74848);function d(e){return s.Children.toArray(e).filter(e=>"\n"!==e)}function h(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return s.Children.toArray(e).flatMap(e=>{if(!e)return[];if((0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return[e];
1const n="string"==typeof e.type?e.type:e.type.name;throw new Error(`Docusaurus error: Bad <Tabs> child <${n}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.\nIf you do not want to pass on a "value" prop to the direct children of <Tabs>, you can also pass an explicit <Tabs values={...}> prop.`)}).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,o.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function u({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const r=(0,t.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,a.aZ)(i),(0,s.useCallback)(e=>{if(!i)return;const n=new URLSearchParams(r.location.search);n.set(i,e),r.replace({...r.location,search:n.toString()})},[i,r])]}function p(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,a=h(e),[o,c]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!u({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:a})),[d,p]=x({queryString:r,groupId:t}),[g,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,l.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),b=(()=>{const e=d??g;return u({value:e,tabValues:a})?e:null})();(0,i.A)(()=>{b&&c(b)},[b]);return{selectedValue:o,selectValue:(0,s.useCallback)(e=>{if(!u({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);c(e),p(e),j(e)},[p,j,a]),tabValues:a,lazy:e.lazy??!1,block:e.block??!1}}const g=(0,s.createContext)(null);function j(){const e=s.useContext(g);if(!e)throw new Error("useTabsContext() must be used within a Tabs component");return e}function b(e){return(0,c.jsx)(g.Provider,{value:e.value,children:e.children})}},80892(e,n,r){r.d(n,{A:()=>a});var s=r(96540),t=r(74848);function i({text:e,checked:n,onToggle:r}){return(0,t.jsxs)("li",{onClick:r,style:{display:"flex",alignItems:"flex-start",gap:"0.6rem",padding:"0.5rem 0",cursor:"pointer",userSelect:"none",listStyle:"none"},children:[(0,t.jsx)("span",{style:{fontSize:"1.2rem",lineHeight:"1.4",flexShrink:0},children:n?"\u2705":"\u2b1c"}),(0,t.jsx)("span",{style:{lineHeight:"1.5",textDecoration:n?"line-through":"none",opacity:n?.7:1},children:e})]})}function a({items:e,storageKey:n}
1){const[r,a]=(0,s.useState)({});(0,s.useEffect)(()=>{try{const e=localStorage.getItem(`success-${n}`);e&&a(JSON.parse(e))}catch{}},[n]);const l=e.length,o=Object.values(r).filter(Boolean).length;return(0,t.jsxs)("div",{children:[o>0&&(0,t.jsxs)("div",{style:{fontSize:"0.85rem",marginBottom:"0.5rem",color:o===l?"#27ae60":"var(--ifm-color-emphasis-600)",fontWeight:o===l?600:400},children:[o,"/",l," completed ",o===l&&"- All done!"]}),(0,t.jsx)("ul",{style:{margin:0,padding:0},children:e.map((e,s)=>(0,t.jsx)(i,{text:e,checked:!!r[s],onToggle:()=>(e=>{const s={...r,[e]:!r[e]};a(s);try{localStorage.setItem(`success-${n}`,JSON.stringify(s))}catch{}})(s)},s))}),o>0&&(0,t.jsx)("button",{onClick:()=>{a({});try{localStorage.removeItem(`success-${n}`)}catch{}},style:{marginTop:"0.5rem",padding:"0.3rem 0.8rem",fontSize:"0.8rem",cursor:"pointer",borderRadius:"4px",border:"1px solid #ccc",background:"transparent"},children:"Reset"})]})}},28453(e,n,r){r.d(n,{R:()=>a,x:()=>l});var s=r(96540);const t={},i=s.createContext(t);function a(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.