getprop("ro.product.device") == "eros-p1" || abort("E3004: This package is for \"eros-p1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
assert_boot_version(0);
ui_print("Source: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250802.083711:user/test-keys");
ui_print("Target: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250811.161243:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250802.083711:user/test-keys" ||
    getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250811.161243:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250802.083711:user/test-keys or Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20250811.161243:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:533293213db9481540141a49f4c5189f5380429d",
                      "EMMC:/dev/block/by-name/boot:33554432:372930a2367bfac4e3091391b8beb542ff7a7ec0") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:533293213db9481540141a49f4c5189f5380429d\" or \"EMMC:/dev/block/by-name/boot:33554432:372930a2367bfac4e3091391b8beb542ff7a7ec0\" has unexpected contents.");
apply_patch_space(73052160) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "310,1,116,377,389,391,392,490,491,969,970,972,974,975,976,991,992,1129,1130,1945,1946,1948,1949,1952,1953,1960,1961,1962,1963,6220,6221,6223,6224,6505,6506,6508,6509,7062,7064,13003,13004,13137,13138,15617,15619,21519,21520,21522,21524,32768,32770,32850,32926,37712,37714,38329,38330,38338,38340,38346,38347,38383,38385,38407,38408,39304,39306,39563,39565,39582,39583,39788,39790,39797,39798,40398,40402,40421,40422,40476,40478,40485,40486,40491,40495,40501,40502,40595,40597,40605,40606,45329,45331,47336,47337,47371,47373,47379,47380,47642,47646,47656,47657,47693,47695,47701,47702,47776,47778,47785,47786,49472,49474,49492,49493,49612,49614,49622,49623,50927,50929,50958,50959,50965,50967,50976,50977,53267,53269,53315,53316,65536,65556,67676,67678,67704,67705,76304,76306,77465,77466,77482,77484,77492,77493,78392,78394,78415,98306,98386,99682,101809,101812,105551,105552,105814,105815,106693,106694,107000,107001,108846,108847,110521,110523,110524,110525,110583,110584,110603,110604,110636,110637,110721,110722,110760,110761,110766,110767,110768,110769,110847,110848,110989,110990,110992,110994,131072,131102,133627,133628,163840,163842,163922,163947,165232,165233,172765,172766,183882,183883,196608,196630,229376,229378,229458,229481,235061,235062,262144,262197,282151,282152,294912,294914,294994,295103,301470,301472,301799,301800,301807,301809,301815,301816,301860,301862,301868,301869,301945,301947,302034,302035,302041,302043,302049,302050,302147,302149,302156,302157,302620,302622,302635,302636,302653,302655,302661,302662,304524,304526,304566,304567,305157,305159,305182,305183,308207,308209,308235,308236,310004,310006,310981,310982,311098,311100,311106,311107,321331,321333,321514,321515,321546,321548,321554,321555,326806,326808,326861,326862,327171,327173,327181,327182,327193,327195,327201,327202,327246,327248,327254,327693,327700,328636,329012,329013,329016,329017,329036,329037,329119,329121,329130,329131,329257,329261,330255,335491,335570,335571") == "271973fc52db3b80801d37c04a6ac95e96e068cf" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "310,1,116,377,389,391,392,490,491,969,970,972,974,975,976,991,992,1129,1130,1945,1946,1948,1949,1952,1953,1960,1961,1962,1963,6220,6221,6223,6224,6505,6506,6508,6509,7062,7064,13003,13004,13137,13138,15617,15619,21519,21520,21522,21524,32768,32770,32850,32926,37712,37714,38329,38330,38338,38340,38346,38347,38383,38385,38407,38408,39304,39306,39563,39565,39582,39583,39788,39790,39797,39798,40398,40402,40421,40422,40476,40478,40485,40486,40491,40495,40501,40502,40595,40597,40605,40606,45329,45331,47336,47337,47371,47373,47379,47380,47642,47646,47656,47657,47693,47695,47701,47702,47776,47778,47785,47786,49472,49474,49492,49493,49612,49614,49622,49623,50927,50929,50958,50959,50965,50967,50976,50977,53267,53269,53315,53316,65536,65556,67676,67678,67704,67705,76304,76306,77465,77466,77482,77484,77492,77493,78392,78394,78415,98306,98386,99682,101809,101812,105551,105552,105814,105815,106693,106694,107000,107001,108846,108847,110521,110523,110524,110525,110583,110584,110603,110604,110636,110637,110721,110722,110760,110761,110766,110767,110768,110769,110847,110848,110989,110990,110992,110994,131072,131102,133627,133628,163840,163842,163922,163947,165232,165233,172765,172766,183882,183883,196608,196630,229376,229378,229458,229481,235061,235062,262144,262197,282151,282152,294912,294914,294994,295103,301470,301472,301799,301800,301807,301809,301815,301816,301860,301862,301868,301869,301945,301947,302034,302035,302041,302043,302049,302050,302147,302149,302156,302157,302620,302622,302635,302636,302653,302655,302661,302662,304524,304526,304566,304567,305157,305159,305182,305183,308207,308209,308235,308236,310004,310006,310981,310982,311098,311100,311106,311107,321331,321333,321514,321515,321546,321548,321554,321555,326806,326808,326861,326862,327171,327173,327181,327182,327193,327195,327201,327202,327246,327248,327254,327693,327700,328636,329012,329013,329016,329017,329036,329037,329119,329121,329130,329131,329257,329261,330255,335491,335570,335571") && block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1(map_partition("vendor"), "42,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2653,2654,6002,6003,6057,6058,15403,15416,32768,32770,32779,32827,38913,38917,38925,38926,39049,39672,39695,39696") == "89d8cdb07808141b3afd410f94aecb5c606c5d5b" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "42,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2653,2654,6002,6003,6057,6058,15403,15416,32768,32770,32779,32827,38913,38917,38925,38926,39049,39672,39695,39696") && block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;
if (range_sha1(map_partition("product"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") == "f39c63f879018c43a5842dc3a9036e9217e879be" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;

# ---- start making changes here ----


# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition product

ui_print("Patching product image after verification.");
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/by-name/boot:33554432:533293213db9481540141a49f4c5189f5380429d",
                "EMMC:/dev/block/by-name/boot:33554432:372930a2367bfac4e3091391b8beb542ff7a7ec0",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:372930a2367bfac4e3091391b8beb542ff7a7ec0");
ui_print("Updating boot-resource.fex into bootloader partition...");
package_extract_file("boot-resource.fex","/dev/block/by-name/bootloader");
ui_print("Updating env.fex into env partition...");
package_extract_file("env.fex","/dev/block/by-name/env");
ui_print("Updating vbmeta.img into vbmeta partition...");
package_extract_file("vbmeta.img","/dev/block/by-name/vbmeta");
ui_print("Updating vbmeta_system.img into vbmeta_system partition...");
package_extract_file("vbmeta_system.img","/dev/block/by-name/vbmeta_system");
ui_print("Updating vbmeta_vendor.img into vbmeta_vendor partition...");
package_extract_file("vbmeta_vendor.img","/dev/block/by-name/vbmeta_vendor");
ui_print("Updating boot...");
burnboot();
set_progress(1.000000);
