getprop("ro.product.device") == "U3Q19" || abort("E3004: This package is for \"U3Q19\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/41:user/release-keys");
ui_print("Target: qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/470:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/41:user/release-keys" ||
    getprop("ro.build.fingerprint") == "qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/470:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/41:user/release-keys or qti/msm8937_64/msm8937_64:9/PKQ1.190616.001/470:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:67108864:5248fd055a7407fce9e0b5f8512ab4ec427e0b61:67108864:580c70031e46224745cf482e4d4d71e9ac7f5022") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:5248fd055a7407fce9e0b5f8512ab4ec427e0b61:67108864:580c70031e46224745cf482e4d4d71e9ac7f5022\" has unexpected contents.");
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/aboot:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/aboot:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/abootbak:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abootbak:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/sbl1:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/sbl1bak:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1bak:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/rpm:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpm:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/rpmbak:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpmbak:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/vbmetabak:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmetabak:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/modem:88080384:80e334f6fc74b22d4145f684c59d2aa2d5d15dbf:88080384:e550995a1b1aea2d101b73b3609864101a391af8") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/modem:88080384:80e334f6fc74b22d4145f684c59d2aa2d5d15dbf:88080384:e550995a1b1aea2d101b73b3609864101a391af8\" has unexpected contents.");
apply_patch_space(88080384) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/bootdevice/by-name/system", "76,1,143,151,152,167,420,8215,12333,14546,14548,15466,16447,16674,16676,16719,17622,19301,19303,19850,19853,22391,22392,24477,32770,32903,47416,47440,47659,47683,47848,47872,48170,48194,48467,48491,60733,60743,75617,75660,98306,98439,160003,160173,162969,162979,163842,163975,177892,177895,182053,182129,193384,193403,220160,220740,220742,220760,229378,229511,235113,236377,236379,236409,236622,240212,240214,240263,251414,294912,294914,524288,524289,546231,554889,555007,555008") == "c9c7fccdef806662c3d0827a538f6becd594745e" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "76,1,143,151,152,167,420,8215,12333,14546,14548,15466,16447,16674,16676,16719,17622,19301,19303,19850,19853,22391,22392,24477,32770,32903,47416,47440,47659,47683,47848,47872,48170,48194,48467,48491,60733,60743,75617,75660,98306,98439,160003,160173,162969,162979,163842,163975,177892,177895,182053,182129,193384,193403,220160,220740,220742,220760,229378,229511,235113,236377,236379,236409,236622,240212,240214,240263,251414,294912,294914,524288,524289,546231,554889,555007,555008") && block_image_verify("/dev/block/bootdevice/by-name/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("/dev/block/bootdevice/by-name/vendor", "28,1,38,41,89,4073,4079,4080,4082,4296,4297,4535,4541,6240,6241,6262,6263,6268,9410,9411,32770,32801,84342,98304,98306,128983,131029,131071,131072") == "9bc8c5d6b6cdfd9fa076c0424039fdc6f1407486" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "28,1,38,41,89,4073,4079,4080,4082,4296,4297,4535,4541,6240,6241,6262,6263,6268,9410,9411,32770,32801,84342,98304,98306,128983,131029,131071,131072") && block_image_verify("/dev/block/bootdevice/by-name/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;

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

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:67108864:5248fd055a7407fce9e0b5f8512ab4ec427e0b61:67108864:580c70031e46224745cf482e4d4d71e9ac7f5022",
            "-", 580c70031e46224745cf482e4d4d71e9ac7f5022, 67108864,
            5248fd055a7407fce9e0b5f8512ab4ec427e0b61,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:5248fd055a7407fce9e0b5f8512ab4ec427e0b61:67108864:580c70031e46224745cf482e4d4d71e9ac7f5022");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
ifelse(msm.boot_update("main"), (
apply_patch("EMMC:/dev/block/bootdevice/by-name/aboot:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345",
            "-", 3334b3fab23dae2fd5f470128b494ddeb0239345, 735456,
            9b46ede551dc93834e69118d107e06add42bc2ab,
            package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345");
apply_patch("EMMC:/dev/block/bootdevice/by-name/sbl1:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6",
            "-", 958def34454c274ba17d7a85b6aed5eb413eb7f6, 390908,
            ef1dae943c6bff40ece06cc708eca53e05645c67,
            package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6");
apply_patch("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf",
            "-", dbb4a14636580e1f775e07c39fc187bcab5ef1cf, 8388608,
            f0ffc5f57c6cfe5186515cc3561588af32f27918,
            package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf");
apply_patch("EMMC:/dev/block/bootdevice/by-name/rpm:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d",
            "-", 3a3e145cc6c1b15596c024799c42e476f245462d, 187800,
            35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d,
            package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpm:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d");
apply_patch("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1",
            "-", 56df78ae96be05156cdc8fa6928480779d5fd6f1, 4096,
            9bd83dbe10ae1f3fc53d4a7596507af320c8224a,
            package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1");
), "");
ifelse(msm.boot_update("backup"), (
apply_patch("EMMC:/dev/block/bootdevice/by-name/abootbak:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345",
            "-", 3334b3fab23dae2fd5f470128b494ddeb0239345, 735456,
            9b46ede551dc93834e69118d107e06add42bc2ab,
            package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:735456:9b46ede551dc93834e69118d107e06add42bc2ab:735456:3334b3fab23dae2fd5f470128b494ddeb0239345");
apply_patch("EMMC:/dev/block/bootdevice/by-name/sbl1bak:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6",
            "-", 958def34454c274ba17d7a85b6aed5eb413eb7f6, 390908,
            ef1dae943c6bff40ece06cc708eca53e05645c67,
            package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1bak:390620:ef1dae943c6bff40ece06cc708eca53e05645c67:390908:958def34454c274ba17d7a85b6aed5eb413eb7f6");
apply_patch("EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf",
            "-", dbb4a14636580e1f775e07c39fc187bcab5ef1cf, 8388608,
            f0ffc5f57c6cfe5186515cc3561588af32f27918,
            package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:f0ffc5f57c6cfe5186515cc3561588af32f27918:8388608:dbb4a14636580e1f775e07c39fc187bcab5ef1cf");
apply_patch("EMMC:/dev/block/bootdevice/by-name/rpmbak:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d",
            "-", 3a3e145cc6c1b15596c024799c42e476f245462d, 187800,
            35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d,
            package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpmbak:187800:35dd97c6034b7c2c5d1fd535eabad7d9b71edf7d:187800:3a3e145cc6c1b15596c024799c42e476f245462d");
apply_patch("EMMC:/dev/block/bootdevice/by-name/vbmetabak:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1",
            "-", 56df78ae96be05156cdc8fa6928480779d5fd6f1, 4096,
            9bd83dbe10ae1f3fc53d4a7596507af320c8224a,
            package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmetabak:4096:9bd83dbe10ae1f3fc53d4a7596507af320c8224a:4096:56df78ae96be05156cdc8fa6928480779d5fd6f1");
), "");
msm.boot_update("finalize");
apply_patch("EMMC:/dev/block/bootdevice/by-name/modem:88080384:80e334f6fc74b22d4145f684c59d2aa2d5d15dbf:88080384:e550995a1b1aea2d101b73b3609864101a391af8",
            "-", e550995a1b1aea2d101b73b3609864101a391af8, 88080384,
            80e334f6fc74b22d4145f684c59d2aa2d5d15dbf,
            package_extract_file("patch/firmware-update/NON-HLOS.bin.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/modem:88080384:80e334f6fc74b22d4145f684c59d2aa2d5d15dbf:88080384:e550995a1b1aea2d101b73b3609864101a391af8");
set_progress(1.000000);
