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.20260612.163223:user/test-keys");
ui_print("Target: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260724.091650:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260612.163223:user/test-keys" ||
    getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260724.091650:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260612.163223:user/test-keys or Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260724.091650:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:5aa95cbcb3cfa9d9ae4ffb97d84a85a4b79b56c7",
                      "EMMC:/dev/block/by-name/boot:33554432:19469003e2d955956696a760e94cd0b294745cc7") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:5aa95cbcb3cfa9d9ae4ffb97d84a85a4b79b56c7\" or \"EMMC:/dev/block/by-name/boot:33554432:19469003e2d955956696a760e94cd0b294745cc7\" has unexpected contents.");
apply_patch_space(33554432) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "324,1,117,378,390,392,393,491,492,970,971,973,975,976,977,992,993,1130,1131,1946,1947,1949,1950,1953,1954,1961,1962,1963,1964,6221,6222,6224,6225,6506,6507,6509,6510,7063,7065,13004,13005,13138,13139,15618,15620,21520,21521,21523,21525,32768,32770,32851,32927,37714,37716,38331,38332,38340,38342,38348,38349,38385,38387,38409,38410,39306,39308,39565,39567,39584,39585,39790,39792,39799,39800,40400,40404,40423,40424,40478,40480,40487,40488,40493,40497,40503,40504,40597,40599,40607,40608,45331,45333,47338,47339,47373,47375,47381,47382,47644,47648,47658,47659,47695,47697,47703,47704,47778,47780,47787,47788,49474,49476,49494,49495,49614,49616,49624,49625,50930,50932,50961,50962,50968,50970,50979,50980,53270,53272,53318,53319,65536,65556,67679,67681,67707,67708,76307,76309,77468,77469,77485,77487,77495,77496,78395,78397,78418,78419,84697,84698,98304,98306,98387,98407,101085,101087,101229,101232,104616,104619,106746,106749,110488,110489,110751,110752,111630,111631,111937,111938,113783,113784,115458,115460,115461,115462,115520,115521,115540,115541,115573,115574,115658,115659,115697,115698,115703,115704,115705,115706,115784,115785,115926,115927,115929,115931,131072,131101,133983,133984,138564,138565,163840,163842,163923,163947,166747,166748,170170,170171,177703,177704,188820,188821,196608,196630,229376,229378,229459,229482,229483,229484,262144,262194,287395,287396,294912,294914,294995,295107,306718,306720,307047,307048,307055,307057,307063,307064,307108,307110,307116,307117,307193,307195,307282,307283,307289,307291,307297,307298,307395,307397,307404,307405,307868,307870,307883,307884,307901,307903,307909,307910,309772,309774,309814,309815,310405,310407,310430,310431,313455,313457,313483,313484,315252,315254,316229,316230,316346,316348,316354,316355,326579,326581,326762,326763,326794,326796,326802,326803,327680,327694,332074,332076,332129,332130,332439,332441,332449,332450,332461,332463,332469,332470,332514,332516,332522,333884,334260,334261,334264,334265,334284,334285,334367,334369,334378,334379,334505,334509,335530,340849,340929,340930") == "e65f12a532ddb4041d77e60c4eb61c0d1013ae95" || 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"), "324,1,117,378,390,392,393,491,492,970,971,973,975,976,977,992,993,1130,1131,1946,1947,1949,1950,1953,1954,1961,1962,1963,1964,6221,6222,6224,6225,6506,6507,6509,6510,7063,7065,13004,13005,13138,13139,15618,15620,21520,21521,21523,21525,32768,32770,32851,32927,37714,37716,38331,38332,38340,38342,38348,38349,38385,38387,38409,38410,39306,39308,39565,39567,39584,39585,39790,39792,39799,39800,40400,40404,40423,40424,40478,40480,40487,40488,40493,40497,40503,40504,40597,40599,40607,40608,45331,45333,47338,47339,47373,47375,47381,47382,47644,47648,47658,47659,47695,47697,47703,47704,47778,47780,47787,47788,49474,49476,49494,49495,49614,49616,49624,49625,50930,50932,50961,50962,50968,50970,50979,50980,53270,53272,53318,53319,65536,65556,67679,67681,67707,67708,76307,76309,77468,77469,77485,77487,77495,77496,78395,78397,78418,78419,84697,84698,98304,98306,98387,98407,101085,101087,101229,101232,104616,104619,106746,106749,110488,110489,110751,110752,111630,111631,111937,111938,113783,113784,115458,115460,115461,115462,115520,115521,115540,115541,115573,115574,115658,115659,115697,115698,115703,115704,115705,115706,115784,115785,115926,115927,115929,115931,131072,131101,133983,133984,138564,138565,163840,163842,163923,163947,166747,166748,170170,170171,177703,177704,188820,188821,196608,196630,229376,229378,229459,229482,229483,229484,262144,262194,287395,287396,294912,294914,294995,295107,306718,306720,307047,307048,307055,307057,307063,307064,307108,307110,307116,307117,307193,307195,307282,307283,307289,307291,307297,307298,307395,307397,307404,307405,307868,307870,307883,307884,307901,307903,307909,307910,309772,309774,309814,309815,310405,310407,310430,310431,313455,313457,313483,313484,315252,315254,316229,316230,316346,316348,316354,316355,326579,326581,326762,326763,326794,326796,326802,326803,327680,327694,332074,332076,332129,332130,332439,332441,332449,332450,332461,332463,332469,332470,332514,332516,332522,333884,334260,334261,334264,334265,334284,334285,334367,334369,334378,334379,334505,334509,335530,340849,340929,340930") && 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,1792,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2651,2652,5982,5983,6058,6059,15404,15417,32768,32770,32779,32827,38980,38984,38992,38993,39116,39739,39764,39765") == "991c71021b649bec8709b3505f20a29f8d1523da" || 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,1792,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2651,2652,5982,5983,6058,6059,15404,15417,32768,32770,32779,32827,38980,38984,38992,38993,39116,39739,39764,39765") && 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") == "7589547e599207db1be9f4700cfc8c3de94613e4" || 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:5aa95cbcb3cfa9d9ae4ffb97d84a85a4b79b56c7",
                "EMMC:/dev/block/by-name/boot:33554432:19469003e2d955956696a760e94cd0b294745cc7",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:19469003e2d955956696a760e94cd0b294745cc7");
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);
