From 88e445a379ff183a67dc9464a050074e47896f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matu=CC=81s=CC=8C=20Tomlein?= Date: Fri, 7 Jul 2023 15:34:51 +0200 Subject: [PATCH 1/5] Remove deprecated kotlin-android-extensions plugin in example app (close #35) --- android/build.gradle | 2 - example/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/pubspec.lock | 181 ++++++++++-------- 4 files changed, 103 insertions(+), 84 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 591dd17..f219312 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -10,7 +10,6 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.1.3' - classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -24,7 +23,6 @@ rootProject.allprojects { apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 31 diff --git a/example/android/build.gradle b/example/android/build.gradle index 28c7fab..06fd60d 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index b8793d3..bfd9890 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/example/pubspec.lock b/example/pubspec.lock index 7a97e62..4f600b2 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -1,90 +1,86 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.3.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.1" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -99,16 +95,18 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" flutter_markdown: dependency: "direct main" description: name: flutter_markdown - url: "https://pub.dartlang.org" + sha256: "86b76dbf30496024d6c816bdc13b97de9449dce1f035a73ee7b4ab7f67eab70b" + url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.16" flutter_test: dependency: "direct dev" description: flutter @@ -128,16 +126,18 @@ packages: dependency: "direct dev" description: name: http - url: "https://pub.dartlang.org" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" integration_test: dependency: "direct dev" description: flutter @@ -147,63 +147,72 @@ packages: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.7" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" markdown: dependency: transitive description: name: markdown - url: "https://pub.dartlang.org" + sha256: "8e332924094383133cee218b676871f42db2514f1f6ac617b6cf6152a7faab8e" + url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "7.1.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.15" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" sky_engine: @@ -217,91 +226,103 @@ packages: path: ".." relative: true source: path - version: "0.2.0" + version: "0.3.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.5.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" uuid: dependency: "direct main" description: name: uuid - url: "https://pub.dartlang.org" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: f6deed8ed625c52864792459709183da231ebf66ff0cf09e69b573227c377efe + url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "11.3.0" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=3.0.0 <4.0.0" + flutter: ">=3.10.0" From 15d8d94a62a8c82a165383a93229b74ac821041a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matu=CC=81s=CC=8C=20Tomlein?= Date: Mon, 10 Jul 2023 10:40:29 +0200 Subject: [PATCH 2/5] Upgrade underlying iOS and Android trackers to version 5 (close #36) --- .github/workflows/build.yml | 2 +- .vscode/launch.json | 2 +- android/build.gradle | 6 +++--- example/android/app/build.gradle | 2 +- example/android/build.gradle | 2 +- example/ios/Podfile.lock | 12 +++++------ example/ios/Runner.xcodeproj/project.pbxproj | 5 ++++- example/ios/Runner/Info.plist | 2 ++ ios/Classes/SnowplowTrackerController.swift | 2 +- .../TrackerConfigurationReader.swift | 21 ++++++++++++++++++- .../readers/events/ConsentGrantedReader.swift | 2 +- .../events/ConsentWithdrawnReader.swift | 2 +- ios/Classes/readers/events/TimingReader.swift | 2 +- .../readers/messages/EventMessageReader.swift | 4 ++-- ios/snowplow_tracker.podspec | 4 ++-- 15 files changed, 47 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04a7b3b..43515dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,7 +66,7 @@ jobs: - name: Run Flutter Driver tests uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 30 + api-level: 31 target: default arch: x86_64 profile: Nexus 6 diff --git a/.vscode/launch.json b/.vscode/launch.json index 44713e7..947b326 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "type": "dart", "args":[ - "--dart-define=ENDPOINT=http://192.168.100.127:9090" + "--dart-define=ENDPOINT=http://192.168.100.2:9090" ] } ] diff --git a/android/build.gradle b/android/build.gradle index f219312..1daf64c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ group 'com.snowplowanalytics.snowplow_tracker' version '1.0-SNAPSHOT' buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() @@ -25,7 +25,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 31 + compileSdkVersion 33 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -47,5 +47,5 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "com.snowplowanalytics:snowplow-android-tracker:4.+" + implementation "com.snowplowanalytics:snowplow-android-tracker:5.+" } diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 132ca8a..1a4d9a9 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/example/android/build.gradle b/example/android/build.gradle index 06fd60d..c9cd053 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 304aaca..7f7135a 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -7,8 +7,8 @@ PODS: - Flutter - snowplow_tracker (0.3.0): - Flutter - - SnowplowTracker (~> 4.0) - - SnowplowTracker (4.0.0): + - SnowplowTracker (~> 5.4) + - SnowplowTracker (5.4.0): - FMDB (~> 2.7) DEPENDENCIES: @@ -32,10 +32,10 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - integration_test: a1e7d09bd98eca2fc37aefd79d4f41ad37bdbbe5 - snowplow_tracker: 7e24aa9029c152d9e97f76578c83d3704c1f103b - SnowplowTracker: 2ddc6db70af5415a87ac279f044d27d140b3a2b8 + integration_test: 13825b8a9334a850581300559b8839134b124670 + snowplow_tracker: f3d9416ea1d05205fc242d4786b98d207337a6dc + SnowplowTracker: a7fa5ae461955637f773a51c941635f39a5b0747 PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.0 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 3fb93fc..e37467d 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -199,10 +199,12 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -230,6 +232,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 73ecc60..a5107a1 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -45,5 +45,7 @@ CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + diff --git a/ios/Classes/SnowplowTrackerController.swift b/ios/Classes/SnowplowTrackerController.swift index eb47e96..dfb919a 100644 --- a/ios/Classes/SnowplowTrackerController.swift +++ b/ios/Classes/SnowplowTrackerController.swift @@ -14,7 +14,7 @@ import SnowplowTracker class SnowplowTrackerController { static func createTracker(_ message: CreateTrackerMessageReader, arguments: [String: Any]) { - var controllers: [Configuration] = [] + var controllers: [ConfigurationProtocol] = [] if let trackerConfig = message.trackerConfig { controllers.append(trackerConfig.toConfiguration()) diff --git a/ios/Classes/readers/configurations/TrackerConfigurationReader.swift b/ios/Classes/readers/configurations/TrackerConfigurationReader.swift index 4ab8156..be40eba 100644 --- a/ios/Classes/readers/configurations/TrackerConfigurationReader.swift +++ b/ios/Classes/readers/configurations/TrackerConfigurationReader.swift @@ -24,7 +24,26 @@ struct TrackerConfigurationReader: Decodable { let applicationContext: Bool? var devicePlatformType: DevicePlatform? { - if let devicePlatform = self.devicePlatform { return SPStringToDevicePlatform(devicePlatform) } + if let devicePlatform = self.devicePlatform { + switch devicePlatform { + case "web": + return DevicePlatform.web + case "srv": + return DevicePlatform.serverSideApp + case "pc": + return DevicePlatform.desktop + case "app": + return DevicePlatform.general + case "tv": + return DevicePlatform.connectedTV + case "cnsl": + return DevicePlatform.gameConsole + case "iot": + return DevicePlatform.internetOfThings + default: + return DevicePlatform.mobile + } + } return nil } } diff --git a/ios/Classes/readers/events/ConsentGrantedReader.swift b/ios/Classes/readers/events/ConsentGrantedReader.swift index 79a273d..3e6e62b 100644 --- a/ios/Classes/readers/events/ConsentGrantedReader.swift +++ b/ios/Classes/readers/events/ConsentGrantedReader.swift @@ -27,7 +27,7 @@ extension ConsentGrantedReader { if let name = self.name { event.name(name) } if let description = self.documentDescription { event.documentDescription(description) } if let documents = self.consentDocuments { - let jsons = documents.map { $0.toConsentDocument().getPayload() } + let jsons = documents.map { $0.toConsentDocument().payload } event.documents(jsons) } return event diff --git a/ios/Classes/readers/events/ConsentWithdrawnReader.swift b/ios/Classes/readers/events/ConsentWithdrawnReader.swift index 1bca0ec..b8ff3ce 100644 --- a/ios/Classes/readers/events/ConsentWithdrawnReader.swift +++ b/ios/Classes/readers/events/ConsentWithdrawnReader.swift @@ -30,7 +30,7 @@ extension ConsentWithdrawnReader { if let name = self.name { event.name(name) } if let description = self.documentDescription { event.documentDescription(description) } if let documents = self.consentDocuments { - let jsons = documents.map { $0.toConsentDocument().getPayload() } + let jsons = documents.map { $0.toConsentDocument().payload } event.documents(jsons) } return event diff --git a/ios/Classes/readers/events/TimingReader.swift b/ios/Classes/readers/events/TimingReader.swift index ea2222c..411e1fd 100644 --- a/ios/Classes/readers/events/TimingReader.swift +++ b/ios/Classes/readers/events/TimingReader.swift @@ -21,7 +21,7 @@ struct TimingReader: Decodable { extension TimingReader { func toTiming() -> Timing { - let event = Timing(category: category, variable: variable, timing: NSNumber(value: timing)) + let event = Timing(category: category, variable: variable, timing: timing) if let label = self.label { event.label(label) } return event } diff --git a/ios/Classes/readers/messages/EventMessageReader.swift b/ios/Classes/readers/messages/EventMessageReader.swift index 7e48454..274886a 100644 --- a/ios/Classes/readers/messages/EventMessageReader.swift +++ b/ios/Classes/readers/messages/EventMessageReader.swift @@ -21,10 +21,10 @@ extension EventMessageReader { func addContextsToEvent(_ event: Event, arguments: [String: Any]) { if let readers = self.contexts, let readersArgs = arguments["contexts"] as? [[String: Any]] { - let contexts = zip(readers, readersArgs).map { (reader, readerArgs) in + let entities = zip(readers, readersArgs).map { (reader, readerArgs) in reader.toSelfDescribingJson(arguments: readerArgs) }.compactMap { $0 } - event.contexts(NSMutableArray(array: contexts)) + event.entities(entities) } } } diff --git a/ios/snowplow_tracker.podspec b/ios/snowplow_tracker.podspec index 4acd96a..37e822b 100644 --- a/ios/snowplow_tracker.podspec +++ b/ios/snowplow_tracker.podspec @@ -15,8 +15,8 @@ A package for tracking Snowplow events in Flutter apps. s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'SnowplowTracker', '~> 4.0' - s.platform = :ios, '9.0' + s.dependency 'SnowplowTracker', '~> 5.4' + s.platform = :ios, '11.0' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } From 2b0076f95771a71627ede998a13ce18cc6ee32af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matu=CC=81s=CC=8C=20Tomlein?= Date: Mon, 10 Jul 2023 10:41:28 +0200 Subject: [PATCH 3/5] Upgrade JavaScript tracker in the example app to version 3.13 --- example/web/sp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/web/sp.js b/example/web/sp.js index 40a49a9..4cfb253 100644 --- a/example/web/sp.js +++ b/example/web/sp.js @@ -1,8 +1,8 @@ /*! - * Web analytics for Snowplow v3.6.0 (http://bit.ly/sp-js) + * Web analytics for Snowplow v3.13.1 (http://bit.ly/sp-js) * Copyright 2022 Snowplow Analytics Ltd, 2010 Anthon Pang * Licensed under BSD-3-Clause */ -"use strict";!function(){function e(e,n){var t,o={};for(t in e)Object.prototype.hasOwnProperty.call(e,t)&&0>n.indexOf(t)&&(o[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(t=Object.getOwnPropertySymbols(e);rn.indexOf(t[r])&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(o[t[r]]=e[t[r]])}return o}function n(e,n,t){if(t||2===arguments.length)for(var o,r=0,a=n.length;r>18&63,u=f>>12&63,l=f>>6&63,f&=63,c[i++]=He.charAt(s)+He.charAt(u)+He.charAt(l)+He.charAt(f)}while(a>16&255,c=u>>8&255,u&=255,a[o++]=64===r?String.fromCharCode(i):64===s?String.fromCharCode(i,c):String.fromCharCode(i,c,u)}while(t=e.length}function g(e){return p(e)||m(e)}function v(e){return!(!Array.isArray(e)||2!==e.length)&&(Array.isArray(e[1])?p(e[0])&&e[1].every(g):p(e[0])&&g(e[1]))}function h(e){return!(!Array.isArray(e)||2!==e.length)&&(!!function(e){var n=0;if(null!=e&&"object"==typeof e&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,"accept")){if(!d(e.accept))return!1;n+=1}if(Object.prototype.hasOwnProperty.call(e,"reject")){if(!d(e.reject))return!1;n+=1}return 0=n}return!1}(e[0])&&(Array.isArray(e[1])?e[1].every(g):g(e[1])))}function y(e){return v(e)||h(e)}function w(e,n){if(!l(e))return!1;if(e=u(e),n=null!==(n=/^iglu:([a-zA-Z0-9-_.]+)\/([a-zA-Z0-9-_]+)\/jsonschema\/([1-9][0-9]*)-(0|[1-9][0-9]*)-(0|[1-9][0-9]*)$/.exec(n))?n.slice(1,6):void 0,e&&n){if(!function(e,n){if(n=n.split("."),e=e.split("."),n&&e){if(n.length!==e.length)return!1;for(var t=0;tt;t++)if(!k(e[t],n[t]))return!1;return!0}return!1}function k(e,n){return e&&n&&"*"===e||e===n}function A(e){return Array.isArray(e)?e:[e]}function b(e,n,t,o){var r;return e=A(e).map((function(e){e:if(m(e))e=[e];else{if(p(e)){n:{var r=void 0;try{if(r=e({event:n.getPayload(),eventType:t,eventSchema:o}),Array.isArray(r)&&r.every(m)||m(r)){var a=r;break n}a=void 0;break n}catch(e){}a=void 0}if(m(a)){e=[a];break e}if(Array.isArray(a)){e=a;break e}}e=void 0}if(e&&0!==e.length)return e})),(r=[]).concat.apply(r,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}function _(e){void 0===e&&(e={});var t,r,c,s,u,l,f,d=e.base64,m=e.corePlugins,p=null!=m?m:[];t=null==d||d,r=p,c=e.callback,s=function(e){return{addPluginContexts:function(t){var o=t?n([],t,!0):[];return e.forEach((function(e){try{e.contexts&&o.push.apply(o,e.contexts())}catch(e){Ge.error("Error adding plugin contexts",e)}})),o}}}(r),u=i(),l=t,f={};var g=Te(Te({},e={track:function(e,n,t){e.withJsonProcessor(o(l)),e.add("eid",Ve.v4()),e.addDict(f),t=function(e){return null==e?{type:"dtm",value:(new Date).getTime()}:"number"==typeof e?{type:"dtm",value:e}:"ttm"===e.type?{type:"ttm",value:e.value}:{type:"dtm",value:e.value||(new Date).getTime()}}(t),e.add(t.type,t.value.toString()),n=function(e,n){e=u.getApplicableContexts(e);var t=[];return n&&n.length&&t.push.apply(t,n),e&&e.length&&t.push.apply(t,e),t}(e,s.addPluginContexts(n)),void 0!==(n=n&&n.length?{schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:n}:void 0)&&e.addJson("cx","co",n),r.forEach((function(n){try{n.beforeTrack&&n.beforeTrack(e)}catch(e){Ge.error("Plugin beforeTrack",e)}})),"function"==typeof c&&c(e);var a=e.build();return r.forEach((function(e){try{e.afterTrack&&e.afterTrack(a)}catch(e){Ge.error("Plugin afterTrack",e)}})),a},addPayloadPair:function(e,n){f[e]=n},getBase64Encoding:function(){return l},setBase64Encoding:function(e){l=e},addPayloadDict:function(e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(f[n]=e[n])},resetPayloadPairs:function(e){f=a(e)?e:{}},setTrackerVersion:function(e){f.tv=e},setTrackerNamespace:function(e){f.tna=e},setAppId:function(e){f.aid=e},setPlatform:function(e){f.p=e},setUserId:function(e){f.uid=e},setScreenResolution:function(e,n){f.res=e+"x"+n},setViewport:function(e,n){f.vp=e+"x"+n},setColorDepth:function(e){f.cd=e},setTimezone:function(e){f.tz=e},setLang:function(e){f.lang=e},setIpAddress:function(e){f.ip=e},setUseragent:function(e){f.ua=e},addGlobalContexts:function(e){u.addGlobalContexts(e)},clearGlobalContexts:function(){u.clearGlobalContexts()},removeGlobalContexts:function(e){u.removeGlobalContexts(e)}}),{addPlugin:function(e){var n,t;e=e.plugin,p.push(e),null===(n=e.logger)||void 0===n||n.call(e,Ge),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,g)}});return null==p||p.forEach((function(e){var n,t;null===(n=e.logger)||void 0===n||n.call(e,Ge),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,g)})),g}function P(e){var n=e.event;return e={schema:"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",data:{schema:e=n.schema,data:n.data}},(n=t()).add("e","ue"),n.addJson("ue_px","ue_pr",e),n}function T(e){return P({event:e={schema:"iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1",data:S({targetUrl:e.targetUrl,elementId:e.elementId,elementClasses:e.elementClasses,elementTarget:e.elementTarget,elementContent:e.elementContent})}})}function S(e,n){void 0===n&&(n={});var t,o={};for(t in e)(n[t]||null!==e[t]&&void 0!==e[t])&&(o[t]=e[t]);return o}function C(e){return Number.isInteger&&Number.isInteger(e)||"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}function O(e){return!(!e||"function"!=typeof e)}function x(e){if(!e||"string"!=typeof e.valueOf()){e=e.text||"";var n=document.getElementsByTagName("title");n&&null!=n[0]&&(e=n[0].text)}return e}function E(e){var n=/^(?:(?:https?|ftp):)\/*(?:[^@]+@)?([^:/#]+)/.exec(e);return n?n[1]:e}function I(e){var n=e.length;return"."===e.charAt(--n)&&(e=e.slice(0,n)),"*."===e.slice(0,2)&&(e=e.slice(1)),e}function j(e){var n=window,t=B("referrer",n.location.href)||B("referer",n.location.href);if(t)return t;if(e)return e;try{if(n.top)return n.top.document.referrer;if(n.parent)return n.parent.document.referrer}catch(e){}return document.referrer}function N(e,n,t,o){return e.addEventListener?(e.addEventListener(n,t,o),!0):e.attachEvent?e.attachEvent("on"+n,t):void(e["on"+n]=t)}function B(e,n){return(e=new RegExp("^[^#]*[?&]"+e+"=([^&#]*)").exec(n))?decodeURIComponent(e[1].replace(/\+/g," ")):null}function D(e,n,t){void 0===t&&(t=63072e3);try{var o=window.localStorage,r=Date.now()+1e3*t;return o.setItem("".concat(e,".expires"),r.toString()),o.setItem(e,n),!0}catch(e){return!1}}function L(e){try{var n=window.localStorage;return n.removeItem(e),n.removeItem(e+".expires"),!0}catch(e){return!1}}function M(e,n,t,o,r,a,i){return 1=o?n+=1:2047>=o?n+=2:55296<=o&&57343>=o?(n+=4,t++):n=65535>o?n+3:n+4}return n}function y(e){for(void 0===e&&(e=!1);O.length&&"string"!=typeof O[0]&&"object"!=typeof O[0];)O.shift();if(1>O.length)C=!1;else{if(!_||"string"!=typeof _.valueOf())throw"No collector configured";if(C=!0,I){var n=function(e){for(var n=0,t=0;n=i);)n+=1;return n},o=void 0;if(M(O))var r=w(o=_,!0,e),a=n(O);else o=b(O[0]),r=w(o,!1,e),a=1;var c=setTimeout((function(){r.abort(),C=!1}),l),s=function(e){for(var n=0;nr.status)s(a),y();else{var e=r.status;(e=!(200<=e&&300>e)&&(!!p.includes(e)||!g.includes(e)))||(Ge.error("Status ".concat(r.status,", will not retry.")),s(a)),C=!1}},M(O)){if(0<(n=O.slice(0,a)).length){if(e=!1,n=n.map((function(e){return e.evt})),E){var d=new Blob([k(A(n))],{type:"application/json"});try{e=navigator.sendBeacon(o,d)}catch(n){e=!1}}!0===e?(s(a),y()):r.send(k(A(n)))}}else r.send()}else if(f||M(O))C=!1;else{o=new Image(1,1);var m=!0;o.onload=function(){m&&(m=!1,O.shift(),t&&D(B,JSON.stringify(O.slice(0,u))),y())},o.onerror=function(){m&&(C=m=!1)},o.src=b(O[0]),setTimeout((function(){m&&C&&(m=!1,y())}),l)}}}function w(e,n,t){var o=new XMLHttpRequest;for(var r in n?(o.open("POST",e,!t),o.setRequestHeader("Content-Type","application/json; charset=UTF-8")):o.open("GET",e,!t),o.withCredentials=m,f&&o.setRequestHeader("SP-Anonymous","*"),d)Object.prototype.hasOwnProperty.call(d,r)&&o.setRequestHeader(r,d[r]);return o}function k(e){return JSON.stringify({schema:"iglu:com.snowplowanalytics.snowplow/payload_data/jsonschema/1-0-4",data:e})}function A(e){for(var n=(new Date).getTime().toString(),t=0;t=i)return Ge.warn("Event ("+e.bytes+"B) too big, max is "+i),n=e,void w(_,!0,!1).send(k(A([n.evt])));O.push(e)}else{var o,s="?",l={co:!0,cx:!0},f=!0;for(o in e)e.hasOwnProperty(o)&&!l.hasOwnProperty(o)&&(f?f=!1:s+="&",s+=encodeURIComponent(o)+"="+encodeURIComponent(e[o]));for(var d in l)e.hasOwnProperty(d)&&l.hasOwnProperty(d)&&(s+="&"+d+"="+encodeURIComponent(e[d]));if(0=c)return Ge.warn("Event ("+l+"B) too big, max is "+c),void(I&&(e=v(e),w(n+r,!0,!1).send(k(A([e.evt])))));O.push(s)}n=!1,t&&(n=D(B,JSON.stringify(O.slice(0,u)))),C||n&&!(O.length>=a)||y()},executeQueue:function(){C||y()},setUseLocalStorage:function(e){t=e},setAnonymousTracking:function(e){f=e},setCollectorUrl:function(e){_=e+N},setBufferSize:function(e){a=e}}}function J(e,n,t){return"translate.googleusercontent.com"===e?(""===t&&(t=n),e=E(n=null!=(e=(e=/^(?:https?|ftp)(?::\/*(?:[^?]+))([?][^#]+)/.exec(n))&&1<(null==e?void 0:e.length)?B("u",e[1]):null)?e:"")):"cc.bingj.com"!==e&&"webcache.googleusercontent.com"!==e||(e=E(n=document.links[0].href)),[e,n,t]}function Y(e,n){return void 0===n&&(n=1),"0"===e[0]?(e[7]=e[6],e[5]=e[4],e[3]++):e[3]=n,n=Ve.v4(),e[6]=n,e[10]=0,e[8]="",e[9]=void 0,n}function K(e){e[4]=Math.round((new Date).getTime()/1e3)}function W(e,n,o,r,a,i){void 0===i&&(i={});var c=[];e=function(e,n,o,r,a,i){function s(){(qe=J(window.location.hostname,window.location.href,j()))[1]!==Ye&&(Ke=j(Ye)),Je=I(qe[0]),Ye=qe[1]}function u(e){var n=(new Date).getTime();if(null!=(e=e.currentTarget)&&e.href){n="_sp="+Le+"."+n;var t=e.href.split("#"),o=t[0].split("?"),r=o.shift();if(o=o.join("?")){for(var a=!0,i=o.split("&"),c=0;cDate.now())var o=n.getItem(e);else n.removeItem(e),n.removeItem(e+".expires"),o=void 0}catch(e){o=void 0}return o}if("cookie"==gn||"cookieAndLocalStorage"==gn)return M(e)}function p(){s(),De=Qe((on||Je)+(rn||"/")).slice(0,4)}function g(){Ee=(new Date).getTime()}function v(){var e=h(),n=e[0];nje&&(je=n),(e=e[1])Be&&(Be=e),g()}function h(){var e=document.documentElement;return e?[e.scrollLeft||window.pageXOffset,e.scrollTop||window.pageYOffset]:[0,0]}function y(){var e=h(),n=e[0];je=Ie=n,Be=Ne=e=e[1]}function w(){A(tn+"ses."+De,"*",fn)}function k(e){var n=tn+"id."+De;e.shift(),A(n,e=e.join("."),ln)}function A(e,n,t){pn&&!dn||("localStorage"==gn?D(e,n,t):("cookie"==gn||"cookieAndLocalStorage"==gn)&&M(e,n,t,rn,on,an,cn))}function b(e){var n=tn+"id."+De,t=tn+"ses."+De;L(n),L(t),M(n,"",-1,"/",on,an,cn),M(t,"",-1,"/",on,an,cn),null!=e&&e.preserveSession||(Me=Ve.v4(),hn=1),null!=e&&e.preserveUser||(Le=Ve.v4(),ze=null)}function P(e){e&&e.stateStorageStrategy&&(i.stateStorageStrategy=e.stateStorageStrategy,gn=ke(i)),pn=!!i.anonymousTracking,dn=Ae(i),mn=be(i),yn.setUseLocalStorage("localStorage"==gn||"cookieAndLocalStorage"==gn),yn.setAnonymousTracking(mn)}function T(){if(!pn||dn){var e="none"!=gn&&!!m("ses"),n=S();if(n[1])var t=n[1];else t=pn?"":Ve.v4(),n[1]=t;Le=t,Me=e?n[6]:Y(n),hn=n[3],"none"!=gn&&(w(),K(n),k(n))}}function S(){return"none"==gn?["1","",0,0,0,void 0,"","","",void 0,0]:function(e,n,t,o){var r=Math.round((new Date).getTime()/1e3);e?(e=e.split(".")).unshift("0"):e=["1",n,r,o,r,"",t],e[6]&&"undefined"!==e[6]||(e[6]=Ve.v4()),e[7]&&"undefined"!==e[7]||(e[7]=""),e[8]&&"undefined"!==e[8]||(e[8]=""),e[9]&&"undefined"!==e[9]||(e[9]=""),e[10]&&"undefined"!==e[10]||(e[10]=0);var a=function(e,n){return e=parseInt(e),isNaN(e)?n:e};return n=function(e){return e?a(e,void 0):void 0},[e[0],e[1],a(e[2],r),a(e[3],o),a(e[4],r),n(e[5]),e[6],e[7],e[8],n(e[9]),a(e[10],0)]}(m("id")||void 0,Le,Me,hn)}function O(e){return 0===e.indexOf("http")?e:("https:"===document.location.protocol?"https":"http")+"://"+e}function z(){wn&&null!=a.pageViewId||(a.pageViewId=Ve.v4())}function U(){return null==a.pageViewId&&(a.pageViewId=Ve.v4()),a.pageViewId}function F(e){var n=e.title,o=e.context,r=e.timestamp;if(e=e.contextCallback,s(),kn&&z(),kn=!0,en=document.title,n=x((Se=n)||en),Fe.track(function(e){var n=e.pageUrl,o=e.pageTitle;e=e.referrer;var r=t();return r.add("e","pv"),r.add("url",n),r.add("page",o),r.add("refr",e),r}({pageUrl:f(Pe||Ye),pageTitle:n,referrer:f(_e||Ke)}),(o||[]).concat(e?e():[]),r),r=new Date,n=!1,An.enabled&&!An.installed){n=An.installed=!0;var a={update:function(){if("undefined"!=typeof window&&"function"==typeof window.addEventListener){var e=!1,n=Object.defineProperty({},"passive",{get:function(){e=!0},set:function(){}}),t=function(){};window.addEventListener("testPassiveEventSupport",t,n),window.removeEventListener("testPassiveEventSupport",t,n),a.hasSupport=e}}};a.update();var i="onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll";Object.prototype.hasOwnProperty.call(a,"hasSupport")?N(document,i,g,{passive:!0}):N(document,i,g),y(),i=function(e,n){return void 0===n&&(n=g),function(e){return N(document,e,n)}},"click mouseup mousedown mousemove keypress keydown keyup".split(" ").forEach(i(document)),["resize","focus","blur"].forEach(i(window)),i(window,v)("scroll")}if(An.enabled&&(nn||n))for(r in Ee=r.getTime(),r=void 0,An.configurations)(n=An.configurations[r])&&(window.clearInterval(n.activityInterval),R(n,o,e))}function R(e,n,t){var o=function(e,n){s(),e({context:n,pageViewId:U(),minXOffset:Ie,minYOffset:Ne,maxXOffset:je,maxYOffset:Be}),y()},r=function(){Ee+e.configHeartBeatTimer>(new Date).getTime()&&o(e.callback,(n||[]).concat(t?t():[]))};e.activityInterval=0!=e.configMinimumVisitLength?window.setTimeout((function(){Ee+e.configMinimumVisitLength>(new Date).getTime()&&o(e.callback,(n||[]).concat(t?t():[])),e.activityInterval=window.setInterval(r,e.configHeartBeatTimer)}),e.configMinimumVisitLength):window.setInterval(r,e.configHeartBeatTimer)}function V(e){var n=e.minimumVisitLength,t=e.heartbeatDelay;if(e=e.callback,C(n)&&C(t))return{configMinimumVisitLength:1e3*n,configHeartBeatTimer:1e3*t,callback:e};Ge.error("Activity tracking minimumVisitLength & heartbeatDelay must be integers")}function H(e){var n=e.context,o=e.minXOffset,r=e.minYOffset,a=e.maxXOffset,i=e.maxYOffset;(e=document.title)!==en&&(en=e,Se=void 0);var c=(e=Fe).track,s=f(Pe||Ye),u=x(Se||en),l=f(_e||Ke);o=Math.round(o),a=Math.round(a),r=Math.round(r),i=Math.round(i);var d=t();d.add("e","pp"),d.add("url",s),d.add("page",u),d.add("refr",l),o&&!isNaN(Number(o))&&d.add("pp_mix",o.toString()),a&&!isNaN(Number(a))&&d.add("pp_max",a.toString()),r&&!isNaN(Number(r))&&d.add("pp_miy",r.toString()),i&&!isNaN(Number(i))&&d.add("pp_may",i.toString()),c.call(e,d,n)}var G,W,X,Q,Z,$,ee,ne,te,oe,re,ae,ie,ce,se,ue,le,fe,de,me,pe,ge,ve,he,ye,we;i.eventMethod=null!==(G=i.eventMethod)&&void 0!==G?G:"post";var ke=function(e){var n;return null!==(n=e.stateStorageStrategy)&&void 0!==n?n:"cookieAndLocalStorage"},Ae=function(e){var n,t;return"boolean"!=typeof e.anonymousTracking&&(null!==(t=!0===(null===(n=e.anonymousTracking)||void 0===n?void 0:n.withSessionTracking))&&void 0!==t&&t)},be=function(e){var n,t;return"boolean"!=typeof e.anonymousTracking&&(null!==(t=!0===(null===(n=e.anonymousTracking)||void 0===n?void 0:n.withServerAnonymisation))&&void 0!==t&&t)};c.push({beforeTrack:function(e){var n=m("ses"),t=S();if(Ue=!!xe&&!!M(xe),un||Ue)b();else{if("0"===t[0]?(Me=n||"none"==gn?t[6]:Y(t),hn=t[3]):(new Date).getTime()-vn>1e3*fn&&(hn++,Me=Y(t,hn)),K(t),0===t[10]&&(n=e.build(),t[8]=n.eid,n=n.dtm||n.ttm,t[9]=n?parseInt(n):void 0),t[10]+=1,n=e.add,"innerWidth"in window)var o=window.innerWidth,r=window.innerHeight;else o=(r=document.documentElement||document.body).clientWidth,r=r.clientHeight;n.call(e,"vp",0<=o&&0<=r?o+"x"+r:null),n=e.add,r=document.documentElement;var a=document.body;o=Math.max(r.clientWidth,r.offsetWidth,r.scrollWidth),r=Math.max(r.clientHeight,r.offsetHeight,r.scrollHeight,a?Math.max(a.offsetHeight,a.scrollHeight):0),o=isNaN(o)||isNaN(r)?"":o+"x"+r,n.call(e,"ds",o),e.add("vid",dn?hn:pn?null:hn),e.add("sid",dn?Me:pn?null:Me),e.add("duid",pn?null:t[1]),e.add("uid",pn?null:ze),s(),e.add("refr",f(_e||Ke)),e.add("url",f(Pe||Ye)),!bn||dn||pn||(n=t[9],n={userId:t[1],sessionId:t[6],eventIndex:t[10],sessionIndex:t[3],previousSessionId:t[7]||null,storageMechanism:"localStorage"==gn?"LOCAL_STORAGE":"COOKIE_1",firstEventId:t[8]||null,firstEventTimestamp:n?new Date(n).toISOString():null},e.addContextEntity({schema:"iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2",data:n})),"none"!=gn&&(k(t),w()),vn=(new Date).getTime()}}}),(null===(X=null===(W=null==i?void 0:i.contexts)||void 0===W?void 0:W.webPage)||void 0===X||X)&&c.push({contexts:function(){return[{schema:"iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0",data:{id:U()}}]}}),c.push.apply(c,null!==(Q=i.plugins)&&void 0!==Q?Q:[]);var _e,Pe,Se,Ce,Oe,xe,Ee,Ie,je,Ne,Be,De,Le,Me,ze,Ue,Fe=_({base64:i.encodeBase64,corePlugins:c,callback:function(e){un||Ue||yn.enqueueRequest(e.build(),Xe)}}),Re=navigator.userLanguage||navigator.language,He=document.characterSet||document.charset,qe=J(window.location.hostname,window.location.href,j()),Je=I(qe[0]),Ye=qe[1],Ke=qe[2],We=null!==(Z=i.platform)&&void 0!==Z?Z:"web",Xe=O(r),Ze=null!==($=i.postPath)&&void 0!==$?$:"/com.snowplowanalytics.snowplow/tp2",$e=null!==(ee=i.appId)&&void 0!==ee?ee:"",en=document.title,nn=null===(ne=i.resetActivityTrackingOnPageView)||void 0===ne||ne,tn=null!==(te=i.cookieName)&&void 0!==te?te:"_sp_",on=null!==(oe=i.cookieDomain)&&void 0!==oe?oe:void 0,rn="/",an=null!==(re=i.cookieSameSite)&&void 0!==re?re:"None",cn=null===(ae=i.cookieSecure)||void 0===ae||ae,sn=navigator.doNotTrack||navigator.msDoNotTrack||window.doNotTrack,un=void 0!==i.respectDoNotTrack&&(i.respectDoNotTrack&&("yes"===sn||"1"===sn)),ln=null!==(ie=i.cookieLifetime)&&void 0!==ie?ie:63072e3,fn=null!==(ce=i.sessionCookieTimeout)&&void 0!==ce?ce:1800,dn=Ae(i),mn=be(i),pn=!!i.anonymousTracking,gn=ke(i),vn=(new Date).getTime(),hn=1,yn=q(e,a,"localStorage"==gn||"cookieAndLocalStorage"==gn,i.eventMethod,Ze,null!==(se=i.bufferSize)&&void 0!==se?se:1,null!==(ue=i.maxPostBytes)&&void 0!==ue?ue:4e4,null!==(le=i.maxGetBytes)&&void 0!==le?le:0,null===(fe=i.useStm)||void 0===fe||fe,null!==(de=i.maxLocalStorageQueueSize)&&void 0!==de?de:1e3,null!==(me=i.connectionTimeout)&&void 0!==me?me:5e3,mn,null!==(pe=i.customHeaders)&&void 0!==pe?pe:{},null===(ge=i.withCredentials)||void 0===ge||ge,null!==(ve=i.retryStatusCodes)&&void 0!==ve?ve:[],(null!==(he=i.dontRetryStatusCodes)&&void 0!==he?he:[]).concat([400,401,403,410,422])),wn=!1,kn=!1,An={enabled:!1,installed:!1,configurations:{}},bn=null!==(we=null===(ye=i.contexts)||void 0===ye?void 0:ye.session)&&void 0!==we&&we;return i.hasOwnProperty("discoverRootDomain")&&i.discoverRootDomain&&(on=function(e,n){for(var t=window.location.hostname,o="_sp_root_domain_test_"+(new Date).getTime(),r="_test_value_"+(new Date).getTime(),a=t.split("."),i=a.length-1;0<=i;){var c=a.slice(i,a.length).join(".");if(M(o,r,0,"/",c,e,n),M(o)===r){for(M(o,"",-1,"/",c,e,n),t=document.cookie.split("; "),o=[],r=0;rn;n++)0==(3&n)&&(e=4294967296*Math.random()),xe[n]=e>>>((3&n)<<3)&255;return xe}}for(var Ee=[],Ie=0;256>Ie;++Ie)Ee[Ie]=(Ie+256).toString(16).substr(1);var je,Ne,Be=function(e,n){return n=n||0,[Ee[e[n++]],Ee[e[n++]],Ee[e[n++]],Ee[e[n++]],"-",Ee[e[n++]],Ee[e[n++]],"-",Ee[e[n++]],Ee[e[n++]],"-",Ee[e[n++]],Ee[e[n++]],"-",Ee[e[n++]],Ee[e[n++]],Ee[e[n++]],Ee[e[n++]],Ee[e[n++]],Ee[e[n++]]].join("")},De=Se,Le=0,Me=0,ze=Se,Ue=function(e,n,t){if(t=n&&t||0,"string"==typeof e&&(n="binary"===e?Array(16):null,e=null),(e=(e=e||{}).random||(e.rng||ze)())[6]=15&e[6]|64,e[8]=63&e[8]|128,n)for(var o=0;16>o;++o)n[t+o]=e[o];return n||Be(e)};Ue.v1=function(e,n,t){t=n&&t||0;var o=n||[],r=(e=e||{}).node||je,a=void 0!==e.clockseq?e.clockseq:Ne;if(null==r||null==a){var i=De();null==r&&(r=je=[1|i[0],i[1],i[2],i[3],i[4],i[5]]),null==a&&(a=Ne=16383&(i[6]<<8|i[7]))}i=void 0!==e.msecs?e.msecs:(new Date).getTime();var c=void 0!==e.nsecs?e.nsecs:Me+1,s=i-Le+(c-Me)/1e4;if(0>s&&void 0===e.clockseq&&(a=a+1&16383),(0>s||i>Le)&&void 0===e.nsecs&&(c=0),1e4<=c)throw Error("uuid.v1(): Can't create more than 10M uuids/sec");for(Le=i,Me=c,Ne=a,e=(1e4*(268435455&(i+=122192928e5))+c)%4294967296,o[t++]=e>>>24&255,o[t++]=e>>>16&255,o[t++]=e>>>8&255,o[t++]=255&e,e=i/4294967296*1e4&268435455,o[t++]=e>>>8&255,o[t++]=255&e,o[t++]=e>>>24&15|16,o[t++]=e>>>16&255,o[t++]=a>>>8|128,o[t++]=255&a,a=0;6>a;++a)o[t+a]=r[a];return n||Be(o)};var Fe,Re,Ve=Ue.v4=Ue,He="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";(Re=Fe||(Fe={}))[Re.none=0]="none",Re[Re.error=1]="error",Re[Re.warn=2]="warn",Re[Re.debug=3]="debug",Re[Re.info=4]="info";var Ge=function(e){return void 0===e&&(e=Fe.warn),{setLogLevel:function(n){e=Fe[n]?n:Fe.warn},warn:function(t,o){for(var r=[],a=2;a=Fe.warn&&"undefined"!=typeof console&&(a="Snowplow: "+t,o?console.warn.apply(console,n([a+"\n",o],r,!1)):console.warn.apply(console,n([a],r,!1)))},error:function(t,o){for(var r=[],a=2;a=Fe.error&&"undefined"!=typeof console&&(a="Snowplow: "+t+"\n",o?console.error.apply(console,n([a+"\n",o],r,!1)):console.error.apply(console,n([a],r,!1)))},debug:function(t){for(var o=[],r=1;r=Fe.debug&&"undefined"!=typeof console&&console.debug.apply(console,n(["Snowplow: "+t],o,!1))},info:function(t){for(var o=[],r=1;r=Fe.info&&"undefined"!=typeof console&&console.info.apply(console,n(["Snowplow: "+t],o,!1))}}}(),qe={},Je={};!function(){var e={rotl:function(e,n){return e<>>32-n},rotr:function(e,n){return e<<32-n|e>>>n},endian:function(n){if(n.constructor==Number)return 16711935&e.rotl(n,8)|4278255360&e.rotl(n,24);for(var t=0;t>>5]|=e[t]<<24-o%32;return n},wordsToBytes:function(e){for(var n=[],t=0;t<32*e.length;t+=8)n.push(e[t>>>5]>>>24-t%32&255);return n},bytesToHex:function(e){for(var n=[],t=0;t>>4).toString(16)),n.push((15&e[t]).toString(16));return n.join("")},hexToBytes:function(e){for(var n=[],t=0;tr;r++)8*t+6*r<=8*e.length?n.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(o>>>6*(3-r)&63)):n.push("=");return n.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var n=[],t=0,o=0;t>>6-2*o);return n}};Je=e}();var Ye={utf8:{stringToBytes:function(e){return Ye.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(Ye.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var n=[],t=0;t>5]|=128<<24-c%32,o[15+(c+64>>>9<<4)]=c,c=0;cy;y++){if(16>y)i[y]=o[c+y];else{var w=i[y-3]^i[y-8]^i[y-14]^i[y-16];i[y]=w<<1|w>>>31}w=(s<<5|s>>>27)+d+(i[y]>>>0)+(20>y?1518500249+(u&l|~u&f):40>y?1859775393+(u^l^f):60>y?(u&l|u&f|l&f)-1894007588:(u^l^f)-899497514),d=f,f=l,l=u<<30|u>>>2,u=s,s=w}s+=m,u+=p,l+=g,f+=v,d+=h}return a=a.call(e,[s,u,l,f,d]),r&&r.asBytes?a:r&&r.asString?t.bytesToString(a):e.bytesToHex(a)};o._blocksize=16,o._digestsize=20,qe=o}();var We,Xe,Qe=qe,Ze={},$e=function(){this.outQueues=[],this.bufferFlushers=[],this.hasLoaded=!1,this.registeredOnLoadHandlers=[]},en="undefined"!=typeof window?ee():void 0,nn=Object.freeze({__proto__:null,addGlobalContexts:function(e,n){X(n,(function(n){n.core.addGlobalContexts(e)}))},addPlugin:function(e,n){X(n,(function(n){n.addPlugin(e)}))},clearGlobalContexts:function(e){X(e,(function(e){e.core.clearGlobalContexts()}))},clearUserData:function(e,n){X(n,(function(n){n.clearUserData(e)}))},crossDomainLinker:function(e,n){X(n,(function(n){n.crossDomainLinker(e)}))},disableAnonymousTracking:function(e,n){X(n,(function(n){n.disableAnonymousTracking(e)}))},discardBrace:function(e,n){X(n,(function(n){n.discardBrace(e)}))},discardHashTag:function(e,n){X(n,(function(n){n.discardHashTag(e)}))},enableActivityTracking:function(e,n){X(n,(function(n){n.enableActivityTracking(e)}))},enableActivityTrackingCallback:function(e,n){X(n,(function(n){n.enableActivityTrackingCallback(e)}))},enableAnonymousTracking:function(e,n){X(n,(function(n){n.enableAnonymousTracking(e)}))},flushBuffer:function(e,n){X(n,(function(n){n.flushBuffer(e)}))},newSession:function(e){X(e,(function(e){e.newSession()}))},newTracker:function(e,n,t){if(void 0===t&&(t={}),en)return Z(e,e,"js-".concat("3.6.0"),n,en,t)},preservePageViewId:function(e){X(e,(function(e){e.preservePageViewId()}))},removeGlobalContexts:function(e,n){X(n,(function(n){n.core.removeGlobalContexts(e)}))},setBufferSize:function(e,n){X(n,(function(n){n.setBufferSize(e)}))},setCollectorUrl:function(e,n){X(n,(function(n){n.setCollectorUrl(e)}))},setCookiePath:function(e,n){X(n,(function(n){n.setCookiePath(e)}))},setCustomUrl:function(e,n){X(n,(function(n){n.setCustomUrl(e)}))},setDocumentTitle:function(e,n){X(n,(function(n){n.setDocumentTitle(e)}))},setOptOutCookie:function(e,n){X(n,(function(n){n.setOptOutCookie(e)}))},setReferrerUrl:function(e,n){X(n,(function(n){n.setReferrerUrl(e)}))},setUserId:function(e,n){X(n,(function(n){n.setUserId(e)}))},setUserIdFromCookie:function(e,n){X(n,(function(n){n.setUserIdFromCookie(e)}))},setUserIdFromLocation:function(e,n){X(n,(function(n){n.setUserIdFromLocation(e)}))},setUserIdFromReferrer:function(e,n){X(n,(function(n){n.setUserIdFromReferrer(e)}))},setVisitorCookieTimeout:function(e,n){X(n,(function(n){n.setVisitorCookieTimeout(e)}))},trackPageView:function(e,n){X(n,(function(n){n.trackPageView(e)}))},trackSelfDescribingEvent:function(e,n){X(n,(function(n){n.core.track(P({event:e.event}),e.context,e.timestamp)}))},trackStructEvent:function(e,n){X(n,(function(n){var o=(n=n.core).track,r=e.category,a=e.action,i=e.label,c=e.property,s=e.value,u=t();u.add("e","se"),u.add("se_ca",r),u.add("se_ac",a),u.add("se_la",i),u.add("se_pr",c),u.add("se_va",null==s?void 0:s.toString()),o.call(n,u,e.context,e.timestamp)}))},updatePageActivity:function(e){X(e,(function(e){e.updatePageActivity()}))},version:"3.6.0"}),tn=Object.freeze({__proto__:null,ClientHintsPlugin:ne}),on=Object.freeze({__proto__:null,OptimizelyXPlugin:te}),rn=Object.freeze({__proto__:null,PerformanceTimingPlugin:oe});!function(e){e.consent="consent",e.contract="contract",e.legalObligation="legal_obligation",e.vitalInterests="vital_interests",e.publicTask="public_task",e.legitimateInterests="legitimate_interests"}(Xe||(Xe={}));var an,cn,sn,un={},ln={},fn=Object.freeze({__proto__:null,ConsentPlugin:re,enableGdprContext:function(e,n){void 0===n&&(n=Object.keys(un));var t=e.documentId,o=e.documentVersion,r=e.documentDescription,a=Xe[e.basisForProcessing];a?n.forEach((function(e){un[e]&&(ln[e]={basisForProcessing:a,documentId:null!=t?t:null,documentVersion:null!=o?o:null,documentDescription:null!=r?r:null})})):an.warn("enableGdprContext: basisForProcessing must be one of: consent, contract, legalObligation, vitalInterests, publicTask, legitimateInterests")},get gdprBasis(){return Xe},trackConsentGranted:function(e,n){void 0===n&&(n=Object.keys(un)),Q(n,un,(function(n){var t=e.expiry,o={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:S({id:e.id,version:e.version,name:e.name,description:e.description})};t=P({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_granted/jsonschema/1-0-0",data:S({expiry:t})}}),o=[o],n.core.track(t,e.context?e.context.concat(o):o,e.timestamp)}))},trackConsentWithdrawn:function(e,n){void 0===n&&(n=Object.keys(un)),Q(n,un,(function(n){var t=e.all,o={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:S({id:e.id,version:e.version,name:e.name,description:e.description})};t=P({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_withdrawn/jsonschema/1-0-0",data:S({all:t})}}),o=[o],n.core.track(t,e.context?e.context.concat(o):o,e.timestamp)}))}}),dn={},mn=!1,pn=Object.freeze({__proto__:null,GeolocationPlugin:ae,enableGeolocationContext:ie}),gn=Object.freeze({__proto__:null,GaCookiesPlugin:ce}),vn={},hn={},yn=Object.freeze({__proto__:null,LinkClickTrackingPlugin:se,enableLinkClickTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(vn)),n.forEach((function(n){vn[n]&&(vn[n].sharedState.hasLoaded?(fe(e,n),de(n)):vn[n].sharedState.registeredOnLoadHandlers.push((function(){fe(e,n),de(n)})))}))},refreshLinkClickTracking:function(e){void 0===e&&(e=Object.keys(vn)),e.forEach((function(e){vn[e]&&(vn[e].sharedState.hasLoaded?de(e):vn[e].sharedState.registeredOnLoadHandlers.push((function(){de(e)})))}))},trackLinkClick:function(e,n){void 0===n&&(n=Object.keys(vn)),Q(n,vn,(function(n){n.core.track(T(e),e.context,e.timestamp)}))}});!function(e){e.CHANGE_FORM="change_form",e.FOCUS_FORM="focus_form",e.SUBMIT_FORM="submit_form"}(sn||(sn={}));var wn=[sn.CHANGE_FORM,sn.FOCUS_FORM,sn.SUBMIT_FORM],kn=["textarea","input","select"],An=function(e){return e},bn={},_n=Object.freeze({__proto__:null,FormTrackingPlugin:he,enableFormTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(bn)),n.forEach((function(n){bn[n]&&(bn[n].sharedState.hasLoaded?me(bn[n],e):bn[n].sharedState.registeredOnLoadHandlers.push((function(){me(bn[n],e)})))}))}}),Pn={},Tn=Object.freeze({__proto__:null,ErrorTrackingPlugin:ye,enableErrorTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(Pn));var t=e.filter,o=e.contextAdder,r=e.context;N(window,"error",(function(e){if(t&&O(t)&&t(e)||null==t){var a=n,i=r||[];o&&O(o)&&(i=i.concat(o(e))),we({message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error,context:i},a)}}),!0)},trackError:we}),Sn={exports:{}};!function(e){var n,t,o,r,a,i;n={"America/Denver":["America/Mazatlan"],"America/Chicago":["America/Mexico_City"],"America/Asuncion":["America/Campo_Grande","America/Santiago"],"America/Montevideo":["America/Sao_Paulo","America/Santiago"],"Asia/Beirut":"Asia/Amman Asia/Jerusalem Europe/Helsinki Asia/Damascus Africa/Cairo Asia/Gaza Europe/Minsk Africa/Windhoek".split(" "),"Pacific/Auckland":["Pacific/Fiji"],"America/Los_Angeles":["America/Santa_Isabel"],"America/New_York":["America/Havana"],"America/Halifax":["America/Goose_Bay"],"America/Godthab":["America/Miquelon"],"Asia/Dubai":["Asia/Yerevan"],"Asia/Jakarta":["Asia/Krasnoyarsk"],"Asia/Shanghai":["Asia/Irkutsk","Australia/Perth"],"Australia/Sydney":["Australia/Lord_Howe"],"Asia/Tokyo":["Asia/Yakutsk"],"Asia/Dhaka":["Asia/Omsk"],"Asia/Baku":["Asia/Yerevan"],"Australia/Brisbane":["Asia/Vladivostok"],"Pacific/Noumea":["Asia/Vladivostok"],"Pacific/Majuro":["Asia/Kamchatka","Pacific/Fiji"],"Pacific/Tongatapu":["Pacific/Apia"],"Asia/Baghdad":["Europe/Minsk","Europe/Moscow"],"Asia/Karachi":["Asia/Yekaterinburg"],"Africa/Johannesburg":["Asia/Gaza","Africa/Cairo"]},t=function(){for(var e=[],n=0;11>=n;n++)for(var t=1;28>=t;t++){var o=-new Date(2014,n,t).getTimezoneOffset();o=null!==o?o:0,e?e&&e[e.length-1]!==o&&e.push(o):e.push()}return e},o=function e(n,t,o){void 0===t&&(t=864e5,o=36e5);var r=new Date(n.getTime()-t).getTime();n=n.getTime()+t;for(var a=new Date(r).getTimezoneOffset(),i=null;ra&&(s=u),a=l),r+=864e5}t=!(!c||!s)&&{s:o(c).getTime(),e:o(s).getTime()},e.push(t)}return e}();return function(e){for(var n=0;n=f.rules[m].s&&e[m].e<=f.rules[m].e)){d="N/A";break}if(d=0,d+=Math.abs(e[m].s-f.rules[m].s),864e6<(d+=Math.abs(f.rules[m].e-e[m].e))){d="N/A";break}}"N/A"!==(f=r(e,t,d,f))&&(o[l.name]=f)}for(var p in o)if(o.hasOwnProperty(p))for(e=0;ee?n[0]+",1":0n.length&&Array.isArray(n[0])&&(n=[{},n[0]]),r(e[0],n)})))}var i;if("string"==typeof n[0]&&f(n[1])&&(void 0===n[2]||Array.isArray(n[2]))){var c=n[0],s=n[1],d=n[2];(null===(i=n[3])||void 0===i||i)&&(i=u.setTimeout((function(){o(c)}),5e3),p[c]={timeout:i}),(i=l.createElement("script")).setAttribute("src",c),i.setAttribute("async","1"),N(i,"error",(function(){o(c),Ge.warn("Failed to load plugin ".concat(s[0]," from ").concat(c))}),!0),N(i,"load",(function(){var n=s[1],r=u[s[0]];if(r&&"object"==typeof r){var i=r[n];n=e(r,["symbol"==typeof n?n:n+""]),h.addPlugin.apply(null,[{plugin:i.apply(null,d)},t]),a(n)}o(c)}),!0),l.head.appendChild(i)}else{if("object"==typeof n[0]&&"string"==typeof n[1]&&(void 0===n[2]||Array.isArray(n[2]))){var m=n[0],v=n[1];if(i=n[2],m)return n=m[v],m=e(m,["symbol"==typeof v?v:v+""]),h.addPlugin.apply(null,[{plugin:n.apply(null,i)},t]),void a(m)}Ge.warn("Failed to add Plugin: ".concat(n[1]))}}function s(){for(var e=[],t=0;tn.indexOf(t)&&(o[t]=e[t]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(t=Object.getOwnPropertySymbols(e);rn.indexOf(t[r])&&Object.prototype.propertyIsEnumerable.call(e,t[r])&&(o[t[r]]=e[t[r]])}return o}function n(e,n,t){if(t||2===arguments.length)for(var o,r=0,i=n.length;r>18&63,u=d>>12&63,l=d>>6&63,d&=63,c[a++]=Ke.charAt(s)+Ke.charAt(u)+Ke.charAt(l)+Ke.charAt(d)}while(i>16&255,c=u>>8&255,u&=255,i[o++]=64===r?String.fromCharCode(a):64===s?String.fromCharCode(a,c):String.fromCharCode(a,c,u)}while(t=e.length}function g(e){return p(e)||m(e)}function v(e){return!(!Array.isArray(e)||2!==e.length)&&(Array.isArray(e[1])?p(e[0])&&e[1].every(g):p(e[0])&&g(e[1]))}function h(e){return!(!Array.isArray(e)||2!==e.length)&&(!!function(e){var n=0;if(null!=e&&"object"==typeof e&&!Array.isArray(e)){if(Object.prototype.hasOwnProperty.call(e,"accept")){if(!f(e.accept))return!1;n+=1}if(Object.prototype.hasOwnProperty.call(e,"reject")){if(!f(e.reject))return!1;n+=1}return 0=n}return!1}(e[0])&&(Array.isArray(e[1])?e[1].every(g):g(e[1])))}function y(e){return v(e)||h(e)}function w(e,n){if(!l(e))return!1;if(e=u(e),n=null!==(n=/^iglu:([a-zA-Z0-9-_.]+)\/([a-zA-Z0-9-_]+)\/jsonschema\/([1-9][0-9]*)-(0|[1-9][0-9]*)-(0|[1-9][0-9]*)$/.exec(n))?n.slice(1,6):void 0,e&&n){if(!function(e,n){if(n=n.split("."),e=e.split("."),n&&e){if(n.length!==e.length)return!1;for(var t=0;tt;t++)if(!k(e[t],n[t]))return!1;return!0}return!1}function k(e,n){return e&&n&&"*"===e||e===n}function b(e){return Array.isArray(e)?e:[e]}function A(e,n,t,o){var r;return e=b(e).map((function(e){e:if(m(e))e=[e];else{if(p(e)){n:{var r=void 0;try{if(r=e({event:n.getPayload(),eventType:t,eventSchema:o}),Array.isArray(r)&&r.every(m)||m(r)){var i=r;break n}i=void 0;break n}catch(e){}i=void 0}if(m(i)){e=[i];break e}if(Array.isArray(i)){e=i;break e}}e=void 0}if(e&&0!==e.length)return e})),(r=[]).concat.apply(r,e.filter((function(e){return null!=e&&e.filter(Boolean)})))}function _(e){void 0===e&&(e={});var t,r,c,s,u,l,d,f=e.base64,m=e.corePlugins,p=null!=m?m:[];t=null==f||f,r=p,c=e.callback,s=function(e){return{addPluginContexts:function(t){var o=t?n([],t,!0):[];return e.forEach((function(e){try{e.contexts&&o.push.apply(o,e.contexts())}catch(e){We.error("Error adding plugin contexts",e)}})),o}}}(r),u=a(),l=t,d={};var g=Ee(Ee({},e={track:function(e,n,t){e.withJsonProcessor(o(l)),e.add("eid",Ye.v4()),e.addDict(d),t=function(e){return null==e?{type:"dtm",value:(new Date).getTime()}:"number"==typeof e?{type:"dtm",value:e}:"ttm"===e.type?{type:"ttm",value:e.value}:{type:"dtm",value:e.value||(new Date).getTime()}}(t),e.add(t.type,t.value.toString()),n=function(e,n){e=u.getApplicableContexts(e);var t=[];return n&&n.length&&t.push.apply(t,n),e&&e.length&&t.push.apply(t,e),t}(e,s.addPluginContexts(n)),void 0!==(n=n&&n.length?{schema:"iglu:com.snowplowanalytics.snowplow/contexts/jsonschema/1-0-0",data:n}:void 0)&&e.addJson("cx","co",n),r.forEach((function(n){try{n.beforeTrack&&n.beforeTrack(e)}catch(e){We.error("Plugin beforeTrack",e)}})),"function"==typeof c&&c(e);var i=e.build();return r.forEach((function(e){try{e.afterTrack&&e.afterTrack(i)}catch(e){We.error("Plugin afterTrack",e)}})),i},addPayloadPair:function(e,n){d[e]=n},getBase64Encoding:function(){return l},setBase64Encoding:function(e){l=e},addPayloadDict:function(e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(d[n]=e[n])},resetPayloadPairs:function(e){d=i(e)?e:{}},setTrackerVersion:function(e){d.tv=e},setTrackerNamespace:function(e){d.tna=e},setAppId:function(e){d.aid=e},setPlatform:function(e){d.p=e},setUserId:function(e){d.uid=e},setScreenResolution:function(e,n){d.res=e+"x"+n},setViewport:function(e,n){d.vp=e+"x"+n},setColorDepth:function(e){d.cd=e},setTimezone:function(e){d.tz=e},setLang:function(e){d.lang=e},setIpAddress:function(e){d.ip=e},setUseragent:function(e){d.ua=e},addGlobalContexts:function(e){u.addGlobalContexts(e)},clearGlobalContexts:function(){u.clearGlobalContexts()},removeGlobalContexts:function(e){u.removeGlobalContexts(e)}}),{addPlugin:function(e){var n,t;e=e.plugin,p.push(e),null===(n=e.logger)||void 0===n||n.call(e,We),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,g)}});return null==p||p.forEach((function(e){var n,t;null===(n=e.logger)||void 0===n||n.call(e,We),null===(t=e.activateCorePlugin)||void 0===t||t.call(e,g)})),g}function P(e){var n=e.event;return e={schema:"iglu:com.snowplowanalytics.snowplow/unstruct_event/jsonschema/1-0-0",data:{schema:e=n.schema,data:n.data}},(n=t()).add("e","ue"),n.addJson("ue_px","ue_pr",e),n}function T(e){return P({event:e={schema:"iglu:com.snowplowanalytics.snowplow/link_click/jsonschema/1-0-1",data:C({targetUrl:e.targetUrl,elementId:e.elementId,elementClasses:e.elementClasses,elementTarget:e.elementTarget,elementContent:e.elementContent})}})}function C(e,n){void 0===n&&(n={});var t,o={};for(t in e)(n[t]||null!==e[t]&&void 0!==e[t])&&(o[t]=e[t]);return o}function S(e,n,t){void 0===t&&(t=63072e3);try{var o=window.localStorage,r=Date.now()+1e3*t;return o.setItem("".concat(e,".expires"),r.toString()),o.setItem(e,n),!0}catch(e){return!1}}function O(e){try{var n=window.localStorage;return n.removeItem(e),n.removeItem(e+".expires"),!0}catch(e){return!1}}function x(e){try{return window.sessionStorage.getItem(e)}catch(e){}}function E(e){return Number.isInteger&&Number.isInteger(e)||"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}function I(e){return!(!e||"function"!=typeof e)}function j(e){if(!e||"string"!=typeof e.valueOf()){e=e.text||"";var n=document.getElementsByTagName("title");n&&null!=n[0]&&(e=n[0].text)}return e}function N(e){var n=/^(?:(?:https?|ftp):)\/*(?:[^@]+@)?([^:/#]+)/.exec(e);return n?n[1]:e}function L(e){var n=e.length;return"."===e.charAt(--n)&&(e=e.slice(0,n)),"*."===e.slice(0,2)&&(e=e.slice(1)),e}function D(e){var n=window,t=z("referrer",n.location.href)||z("referer",n.location.href);if(t)return t;if(e)return e;try{if(n.top)return n.top.document.referrer;if(n.parent)return n.parent.document.referrer}catch(e){}return document.referrer}function B(e,n,t,o){return e.addEventListener?(e.addEventListener(n,t,o),!0):e.attachEvent?e.attachEvent("on"+n,t):void(e["on"+n]=t)}function z(e,n){return(e=new RegExp("^[^#]*[?&]"+e+"=([^&#]*)").exec(n))?decodeURIComponent(e[1].replace(/\+/g," ")):null}function M(e,n,t,o,r,i,a){return 1=o?n+=1:2047>=o?n+=2:55296<=o&&57343>=o?(n+=4,t++):n=65535>o?n+3:n+4}return n}function y(e){for(void 0===e&&(e=!1);x.length&&"string"!=typeof x[0]&&"object"!=typeof x[0];)x.shift();if(1>x.length)O=!1;else{if(!_||"string"!=typeof _.valueOf())throw"No collector configured";if(O=!0,j){var n=function(e){for(var n=0,t=0;n=a);)n+=1;return n},o=void 0;if(z(x))var r=w(o=_,!0,e),i=n(x);else o=A(x[0]),r=w(o,!1,e),i=1;var c=setTimeout((function(){r.abort(),O=!1}),l),s=function(e){for(var n=0;nr.status)s(i),y();else{var e=r.status;(e=!(200<=e&&300>e)&&(!!p.includes(e)||!g.includes(e)))||(We.error("Status ".concat(r.status,", will not retry.")),s(i)),O=!1}},z(x)){if(0<(n=x.slice(0,i)).length){if(e=!1,n=n.map((function(e){return e.evt})),I){var f=new Blob([k(b(n))],{type:"application/json"});try{e=navigator.sendBeacon(o,f)}catch(n){e=!1}}!0===e?(s(i),y()):r.send(k(b(n)))}}else r.send()}else if(d||z(x))O=!1;else{o=new Image(1,1);var m=!0;o.onload=function(){m&&(m=!1,x.shift(),t&&S(D,JSON.stringify(x.slice(0,u))),y())},o.onerror=function(){m&&(O=m=!1)},o.src=A(x[0]),setTimeout((function(){m&&O&&(m=!1,y())}),l)}}}function w(e,n,t){var o=new XMLHttpRequest;for(var r in n?(o.open("POST",e,!t),o.setRequestHeader("Content-Type","application/json; charset=UTF-8")):o.open("GET",e,!t),o.withCredentials=m,d&&o.setRequestHeader("SP-Anonymous","*"),f)Object.prototype.hasOwnProperty.call(f,r)&&o.setRequestHeader(r,f[r]);return o}function k(e){return JSON.stringify({schema:"iglu:com.snowplowanalytics.snowplow/payload_data/jsonschema/1-0-4",data:e})}function b(e){for(var n=(new Date).getTime().toString(),t=0;t=a)return We.warn("Event ("+e.bytes+"B) too big, max is "+a),n=e,void w(_,!0,!1).send(k(b([n.evt])));x.push(e)}else{var o,s="?",l={co:!0,cx:!0},d=!0;for(o in e)e.hasOwnProperty(o)&&!l.hasOwnProperty(o)&&(d?d=!1:s+="&",s+=encodeURIComponent(o)+"="+encodeURIComponent(e[o]));for(var f in l)e.hasOwnProperty(f)&&l.hasOwnProperty(f)&&(s+="&"+f+"="+encodeURIComponent(e[f]));if(0=c)return We.warn("Event ("+l+"B) too big, max is "+c),void(j&&(e=v(e),w(n+r,!0,!1).send(k(b([e.evt])))));x.push(s)}n=!1,t&&(n=S(D,JSON.stringify(x.slice(0,u)))),O||n&&!(x.length>=i)||y()},executeQueue:function(){O||y()},setUseLocalStorage:function(e){t=e},setAnonymousTracking:function(e){d=e},setCollectorUrl:function(e){_=e+L},setBufferSize:function(e){i=e}}}function Y(e,n,t){return"translate.googleusercontent.com"===e?(""===t&&(t=n),e=N(n=null!=(e=(e=/^(?:https?|ftp)(?::\/*(?:[^?]+))([?][^#]+)/.exec(n))&&1<(null==e?void 0:e.length)?z("u",e[1]):null)?e:"")):"cc.bingj.com"!==e&&"webcache.googleusercontent.com"!==e||(e=N(n=document.links[0].href)),[e,n,t]}function K(e,n){return void 0===n&&(n={memorizedVisitCount:1}),n=n.memorizedVisitCount,"0"===e[0]?(e[7]=e[6],e[5]=e[4],e[3]++):e[3]=n,n=Ye.v4(),e[6]=n,e[10]=0,e[8]="",e[9]=void 0,n}function W(e){e[4]=Math.round((new Date).getTime()/1e3)}function X(e,n,t){var o=e[9];return{userId:t?"00000000-0000-0000-0000-000000000000":e[1],sessionId:e[6],eventIndex:e[10],sessionIndex:e[3],previousSessionId:t?null:e[7]||null,storageMechanism:"localStorage"==n?"LOCAL_STORAGE":"COOKIE_1",firstEventId:e[8]||null,firstEventTimestamp:o?new Date(o).toISOString():null}}function Q(){var e=Z;if("innerWidth"in window)var n=window.innerWidth,t=window.innerHeight;else n=(t=document.documentElement||document.body).clientWidth,t=t.clientHeight;e=e(0<=n&&0<=t?n+"x"+t:null),n=Z;var o=document.documentElement,r=document.body;return t=Math.max(o.clientWidth,o.offsetWidth,o.scrollWidth),o=Math.max(o.clientHeight,o.offsetHeight,o.scrollHeight,r?Math.max(r.offsetHeight,r.scrollHeight):0),{viewport:e,documentSize:n(t=isNaN(t)||isNaN(o)?"":t+"x"+o),resolution:Z(screen.width+"x"+screen.height),colorDepth:screen.colorDepth,devicePixelRatio:window.devicePixelRatio,cookiesEnabled:window.navigator.cookieEnabled,online:window.navigator.onLine,browserLanguage:navigator.language||navigator.userLanguage,documentLanguage:document.documentElement.lang,webdriver:window.navigator.webdriver,deviceMemory:window.navigator.deviceMemory,hardwareConcurrency:window.navigator.hardwareConcurrency}}function Z(e){return e&&e.split("x").map((function(e){return Math.floor(Number(e))})).join("x")}function $(e,n,o,r,i,a){void 0===a&&(a={});var c=[];e=function(e,n,o,r,i,a){function s(){(Ze=Y(window.location.hostname,window.location.href,D()))[1]!==en&&(nn=D(en)),$e=L(Ze[0]),en=Ze[1]}function u(e){var n=(new Date).getTime();if(null!=(e=e.currentTarget)&&e.href){n="_sp="+Ge+"."+n;var t=e.href.split("#"),o=t[0].split("?"),r=o.shift();if(o=o.join("?")){for(var i=!0,a=o.split("&"),c=0;cDate.now())var o=n.getItem(e);else n.removeItem(e),n.removeItem(e+".expires"),o=void 0}catch(e){o=void 0}return o}if("cookie"==An||"cookieAndLocalStorage"==An)return M(e)}function p(){s(),He=tn((dn||$e)+(fn||"/")).slice(0,4)}function g(){Me=(new Date).getTime()}function v(){var e=h(),n=e[0];nFe&&(Fe=n),(e=e[1])Re&&(Re=e),g()}function h(){var e=document.documentElement;return e?[e.scrollLeft||window.pageXOffset,e.scrollTop||window.pageYOffset]:[0,0]}function y(){var e=h(),n=e[0];Fe=Ue=n,Re=Ve=e=e[1]}function w(){return b(ln+"ses."+He,"*",yn)}function k(e){var n=ln+"id."+He;return e.shift(),b(n,e=e.join("."),hn)}function b(e,n,t){return!(bn&&!wn)&&("localStorage"==An?S(e,n,t):("cookie"==An||"cookieAndLocalStorage"==An)&&(M(e,n,t,fn,dn,mn,pn),-1!==document.cookie.indexOf("".concat(e,"="))))}function A(e){var n=ln+"id."+He,t=ln+"ses."+He;O(n),O(t),M(n,"",-1,"/",dn,mn,pn),M(t,"",-1,"/",dn,mn,pn),null!=e&&e.preserveSession||(qe=Ye.v4(),Pn=1),null!=e&&e.preserveUser||(Ge=bn?"":Ye.v4(),Je=null)}function P(e){e&&e.stateStorageStrategy&&(a.stateStorageStrategy=e.stateStorageStrategy,An=Ce(a)),bn=!!a.anonymousTracking,wn=Se(a),kn=Oe(a),Tn.setUseLocalStorage("localStorage"==An||"cookieAndLocalStorage"==An),Tn.setAnonymousTracking(kn)}function T(){if(!bn||wn){var e="none"!=An&&!!m("ses"),n=C();if(n[1])var t=n[1];else t=bn?"":Ye.v4(),n[1]=t;Ge=t,qe=e?n[6]:K(n),Pn=n[3],"none"!=An&&(w(),W(n),k(n))}}function C(){return"none"==An?["1","",0,0,0,void 0,"","","",void 0,0]:function(e,n,t,o){var r=Math.round((new Date).getTime()/1e3);e?(e=e.split(".")).unshift("0"):e=["1",n,r,o,r,"",t],e[6]&&"undefined"!==e[6]||(e[6]=Ye.v4()),e[7]&&"undefined"!==e[7]||(e[7]=""),e[8]&&"undefined"!==e[8]||(e[8]=""),e[9]&&"undefined"!==e[9]||(e[9]=""),e[10]&&"undefined"!==e[10]||(e[10]=0);var i=function(e,n){return e=parseInt(e),isNaN(e)?n:e};return n=function(e){return e?i(e,void 0):void 0},[e[0],e[1],i(e[2],r),i(e[3],o),i(e[4],r),n(e[5]),e[6],e[7],e[8],n(e[9]),i(e[10],0)]}(m("id")||void 0,Ge,qe,Pn)}function I(e){return 0===e.indexOf("http")?e:("https:"===document.location.protocol?"https":"http")+"://"+e}function U(){Cn&&null!=i.pageViewId||(i.pageViewId=Ye.v4())}function F(){return null==i.pageViewId&&(i.pageViewId=Ye.v4()),i.pageViewId}function V(){if("none"===An||bn||!Ie)return null;var e=x("_sp_tab_id");if(!e){e=Ye.v4();try{window.sessionStorage.setItem("_sp_tab_id",e)}catch(e){}e=x("_sp_tab_id")}return e||null}function R(e){var n=e.title,o=e.context,r=e.timestamp;if(e=e.contextCallback,s(),Sn&&U(),Sn=!0,sn=document.title,n=j((Le=n)||sn),Xe.track(function(e){var n=e.pageUrl,o=e.pageTitle;e=e.referrer;var r=t();return r.add("e","pv"),r.add("url",n),r.add("page",o),r.add("refr",e),r}({pageUrl:d(Ne||en),pageTitle:n,referrer:d(je||nn)}),(o||[]).concat(e?e():[]),r),r=new Date,n=!1,On.enabled&&!On.installed){n=On.installed=!0;var i={update:function(){if("undefined"!=typeof window&&"function"==typeof window.addEventListener){var e=!1,n=Object.defineProperty({},"passive",{get:function(){e=!0},set:function(){}}),t=function(){};window.addEventListener("testPassiveEventSupport",t,n),window.removeEventListener("testPassiveEventSupport",t,n),i.hasSupport=e}}};i.update();var a="onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll";Object.prototype.hasOwnProperty.call(i,"hasSupport")?B(document,a,g,{passive:!0}):B(document,a,g),y(),a=function(e,n){return void 0===n&&(n=g),function(e){return B(document,e,n)}},"click mouseup mousedown mousemove keypress keydown keyup touchend touchstart".split(" ").forEach(a(document)),["resize","focus","blur"].forEach(a(window)),a(window,v)("scroll")}if(On.enabled&&(un||n))for(r in Me=r.getTime(),r=void 0,On.configurations)(n=On.configurations[r])&&(window.clearInterval(n.activityInterval),H(n,o,e))}function H(e,n,t){var o=function(e,n){s(),e({context:n,pageViewId:F(),minXOffset:Ue,minYOffset:Ve,maxXOffset:Fe,maxYOffset:Re}),y()},r=function(){Me+e.configHeartBeatTimer>(new Date).getTime()&&o(e.callback,(n||[]).concat(t?t():[]))};e.activityInterval=0!=e.configMinimumVisitLength?window.setTimeout((function(){Me+e.configMinimumVisitLength>(new Date).getTime()&&o(e.callback,(n||[]).concat(t?t():[])),e.activityInterval=window.setInterval(r,e.configHeartBeatTimer)}),e.configMinimumVisitLength):window.setInterval(r,e.configHeartBeatTimer)}function G(e){var n=e.minimumVisitLength,t=e.heartbeatDelay;if(e=e.callback,E(n)&&E(t))return{configMinimumVisitLength:1e3*n,configHeartBeatTimer:1e3*t,callback:e};We.error("Activity tracking minimumVisitLength & heartbeatDelay must be integers")}function q(e){var n=e.context,o=e.minXOffset,r=e.minYOffset,i=e.maxXOffset,a=e.maxYOffset;(e=document.title)!==sn&&(sn=e,Le=void 0);var c=(e=Xe).track,s=d(Ne||en),u=j(Le||sn),l=d(je||nn);o=Math.round(o),i=Math.round(i),r=Math.round(r),a=Math.round(a);var f=t();f.add("e","pp"),f.add("url",s),f.add("page",u),f.add("refr",l),o&&!isNaN(Number(o))&&f.add("pp_mix",o.toString()),i&&!isNaN(Number(i))&&f.add("pp_max",i.toString()),r&&!isNaN(Number(r))&&f.add("pp_miy",r.toString()),a&&!isNaN(Number(a))&&f.add("pp_may",a.toString()),c.call(e,f,n)}var Z,$,ee,ne,te,oe,re,ie,ae,ce,se,ue,le,de,fe,me,pe,ge,ve,he,ye,we,ke,be,Ae,_e,Pe,Te;a.eventMethod=null!==(Z=a.eventMethod)&&void 0!==Z?Z:"post";var Ce=function(e){var n;return null!==(n=e.stateStorageStrategy)&&void 0!==n?n:"cookieAndLocalStorage"},Se=function(e){var n,t;return"boolean"!=typeof e.anonymousTracking&&(null!==(t=!0===(null===(n=e.anonymousTracking)||void 0===n?void 0:n.withSessionTracking))&&void 0!==t&&t)},Oe=function(e){var n,t;return"boolean"!=typeof e.anonymousTracking&&(null!==(t=!0===(null===(n=e.anonymousTracking)||void 0===n?void 0:n.withServerAnonymisation))&&void 0!==t&&t)},xe=null!==(ee=null===($=null==a?void 0:a.contexts)||void 0===$?void 0:$.browser)&&void 0!==ee&&ee,Ie=null===(te=null===(ne=null==a?void 0:a.contexts)||void 0===ne?void 0:ne.webPage)||void 0===te||te;c.push({beforeTrack:function(e){var n=m("ses"),t=C(),o=0===t[10];if(Ke=!!ze&&!!M(ze),vn||Ke)A();else{if("0"===t[0]?(qe=n||"none"==An?t[6]:K(t),Pn=t[3]):(new Date).getTime()-_n>1e3*yn&&(Pn++,qe=K(t,{memorizedVisitCount:Pn})),W(t),0===t[10]){var r=e.build();t[8]=r.eid,r=r.dtm||r.ttm,t[9]=r?parseInt(r):void 0}t[10]+=1;var i=(r=Q()).documentSize;e.add("vp",r.viewport),e.add("ds",i),e.add("vid",wn?Pn:bn?null:Pn),e.add("sid",wn?qe:bn?null:qe),e.add("duid",bn?null:t[1]),e.add("uid",bn?null:Je),s(),e.add("refr",d(je||nn)),e.add("url",d(Ne||en)),r=X(t,An,bn),!xn||bn&&!wn||e.addContextEntity({schema:"iglu:com.snowplowanalytics.snowplow/client_session/jsonschema/1-0-2",data:r}),"none"!=An&&(k(t),e=w(),n&&!o||!e||!En||In||(En(r),In=!1)),_n=(new Date).getTime()}}}),Ie&&c.push({contexts:function(){return[{schema:"iglu:com.snowplowanalytics.snowplow/web_page/jsonschema/1-0-0",data:{id:F()}}]}}),xe&&c.push({contexts:function(){return[{schema:"iglu:com.snowplowanalytics.snowplow/browser_context/jsonschema/1-0-0",data:Ee(Ee({},Q()),{tabId:V()})}]}}),c.push.apply(c,null!==(oe=a.plugins)&&void 0!==oe?oe:[]);var je,Ne,Le,De,Be,ze,Me,Ue,Fe,Ve,Re,He,Ge,qe,Je,Ke,Xe=_({base64:a.encodeBase64,corePlugins:c,callback:function(e){vn||Ke||Tn.enqueueRequest(e.build(),rn)}}),Qe=document.characterSet||document.charset,Ze=Y(window.location.hostname,window.location.href,D()),$e=L(Ze[0]),en=Ze[1],nn=Ze[2],on=null!==(re=a.platform)&&void 0!==re?re:"web",rn=I(r),an=null!==(ie=a.postPath)&&void 0!==ie?ie:"/com.snowplowanalytics.snowplow/tp2",cn=null!==(ae=a.appId)&&void 0!==ae?ae:"",sn=document.title,un=null===(ce=a.resetActivityTrackingOnPageView)||void 0===ce||ce,ln=null!==(se=a.cookieName)&&void 0!==se?se:"_sp_",dn=null!==(ue=a.cookieDomain)&&void 0!==ue?ue:void 0,fn="/",mn=null!==(le=a.cookieSameSite)&&void 0!==le?le:"None",pn=null===(de=a.cookieSecure)||void 0===de||de,gn=navigator.doNotTrack||navigator.msDoNotTrack||window.doNotTrack,vn=void 0!==a.respectDoNotTrack&&(a.respectDoNotTrack&&("yes"===gn||"1"===gn)),hn=null!==(fe=a.cookieLifetime)&&void 0!==fe?fe:63072e3,yn=null!==(me=a.sessionCookieTimeout)&&void 0!==me?me:1800,wn=Se(a),kn=Oe(a),bn=!!a.anonymousTracking,An=Ce(a),_n=(new Date).getTime(),Pn=1,Tn=J(e,i,"localStorage"==An||"cookieAndLocalStorage"==An,a.eventMethod,an,null!==(pe=a.bufferSize)&&void 0!==pe?pe:1,null!==(ge=a.maxPostBytes)&&void 0!==ge?ge:4e4,null!==(ve=a.maxGetBytes)&&void 0!==ve?ve:0,null===(he=a.useStm)||void 0===he||he,null!==(ye=a.maxLocalStorageQueueSize)&&void 0!==ye?ye:1e3,null!==(we=a.connectionTimeout)&&void 0!==we?we:5e3,kn,null!==(ke=a.customHeaders)&&void 0!==ke?ke:{},null===(be=a.withCredentials)||void 0===be||be,null!==(Ae=a.retryStatusCodes)&&void 0!==Ae?Ae:[],(null!==(_e=a.dontRetryStatusCodes)&&void 0!==_e?_e:[]).concat([400,401,403,410,422])),Cn=!1,Sn=!1,On={enabled:!1,installed:!1,configurations:{}},xn=null!==(Te=null===(Pe=a.contexts)||void 0===Pe?void 0:Pe.session)&&void 0!==Te&&Te,En=a.onSessionUpdateCallback,In=!1;a.hasOwnProperty("discoverRootDomain")&&a.discoverRootDomain&&(dn=function(e,n){for(var t=window.location.hostname,o="_sp_root_domain_test_"+(new Date).getTime(),r="_test_value_"+(new Date).getTime(),i=t.split("."),a=i.length-2;0<=a;a--){var c=i.slice(a).join(".");if(M(o,r,0,"/",c,e,n),M(o)===r){for(M(o,"",-1,"/",c,e,n),t=document.cookie.split("; "),o=[],r=0;rn;n++)0==(3&n)&&(e=4294967296*Math.random()),Le[n]=e>>>((3&n)<<3)&255;return Le}}for(var De=[],Be=0;256>Be;++Be)De[Be]=(Be+256).toString(16).substr(1);var ze,Me,Ue=function(e,n){return n=n||0,[De[e[n++]],De[e[n++]],De[e[n++]],De[e[n++]],"-",De[e[n++]],De[e[n++]],"-",De[e[n++]],De[e[n++]],"-",De[e[n++]],De[e[n++]],"-",De[e[n++]],De[e[n++]],De[e[n++]],De[e[n++]],De[e[n++]],De[e[n++]]].join("")},Fe=Ie,Ve=0,Re=0,He=Ie,Ge=function(e,n,t){if(t=n&&t||0,"string"==typeof e&&(n="binary"===e?Array(16):null,e=null),(e=(e=e||{}).random||(e.rng||He)())[6]=15&e[6]|64,e[8]=63&e[8]|128,n)for(var o=0;16>o;++o)n[t+o]=e[o];return n||Ue(e)};Ge.v1=function(e,n,t){t=n&&t||0;var o=n||[],r=(e=e||{}).node||ze,i=void 0!==e.clockseq?e.clockseq:Me;if(null==r||null==i){var a=Fe();null==r&&(r=ze=[1|a[0],a[1],a[2],a[3],a[4],a[5]]),null==i&&(i=Me=16383&(a[6]<<8|a[7]))}a=void 0!==e.msecs?e.msecs:(new Date).getTime();var c=void 0!==e.nsecs?e.nsecs:Re+1,s=a-Ve+(c-Re)/1e4;if(0>s&&void 0===e.clockseq&&(i=i+1&16383),(0>s||a>Ve)&&void 0===e.nsecs&&(c=0),1e4<=c)throw Error("uuid.v1(): Can't create more than 10M uuids/sec");for(Ve=a,Re=c,Me=i,e=(1e4*(268435455&(a+=122192928e5))+c)%4294967296,o[t++]=e>>>24&255,o[t++]=e>>>16&255,o[t++]=e>>>8&255,o[t++]=255&e,e=a/4294967296*1e4&268435455,o[t++]=e>>>8&255,o[t++]=255&e,o[t++]=e>>>24&15|16,o[t++]=e>>>16&255,o[t++]=i>>>8|128,o[t++]=255&i,i=0;6>i;++i)o[t+i]=r[i];return n||Ue(o)};var qe,Je,Ye=Ge.v4=Ge,Ke="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";(Je=qe||(qe={}))[Je.none=0]="none",Je[Je.error=1]="error",Je[Je.warn=2]="warn",Je[Je.debug=3]="debug",Je[Je.info=4]="info";var We=function(e){return void 0===e&&(e=qe.warn),{setLogLevel:function(n){e=qe[n]?n:qe.warn},warn:function(t,o){for(var r=[],i=2;i=qe.warn&&"undefined"!=typeof console&&(i="Snowplow: "+t,o?console.warn.apply(console,n([i+"\n",o],r,!1)):console.warn.apply(console,n([i],r,!1)))},error:function(t,o){for(var r=[],i=2;i=qe.error&&"undefined"!=typeof console&&(i="Snowplow: "+t+"\n",o?console.error.apply(console,n([i+"\n",o],r,!1)):console.error.apply(console,n([i],r,!1)))},debug:function(t){for(var o=[],r=1;r=qe.debug&&"undefined"!=typeof console&&console.debug.apply(console,n(["Snowplow: "+t],o,!1))},info:function(t){for(var o=[],r=1;r=qe.info&&"undefined"!=typeof console&&console.info.apply(console,n(["Snowplow: "+t],o,!1))}}}(),Xe={},Qe={};!function(){var e={rotl:function(e,n){return e<>>32-n},rotr:function(e,n){return e<<32-n|e>>>n},endian:function(n){if(n.constructor==Number)return 16711935&e.rotl(n,8)|4278255360&e.rotl(n,24);for(var t=0;t>>5]|=e[t]<<24-o%32;return n},wordsToBytes:function(e){for(var n=[],t=0;t<32*e.length;t+=8)n.push(e[t>>>5]>>>24-t%32&255);return n},bytesToHex:function(e){for(var n=[],t=0;t>>4).toString(16)),n.push((15&e[t]).toString(16));return n.join("")},hexToBytes:function(e){for(var n=[],t=0;tr;r++)8*t+6*r<=8*e.length?n.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(o>>>6*(3-r)&63)):n.push("=");return n.join("")},base64ToBytes:function(e){e=e.replace(/[^A-Z0-9+\/]/gi,"");for(var n=[],t=0,o=0;t>>6-2*o);return n}};Qe=e}();var Ze={utf8:{stringToBytes:function(e){return Ze.bin.stringToBytes(unescape(encodeURIComponent(e)))},bytesToString:function(e){return decodeURIComponent(escape(Ze.bin.bytesToString(e)))}},bin:{stringToBytes:function(e){for(var n=[],t=0;t>5]|=128<<24-c%32,o[15+(c+64>>>9<<4)]=c,c=0;cy;y++){if(16>y)a[y]=o[c+y];else{var w=a[y-3]^a[y-8]^a[y-14]^a[y-16];a[y]=w<<1|w>>>31}w=(s<<5|s>>>27)+f+(a[y]>>>0)+(20>y?1518500249+(u&l|~u&d):40>y?1859775393+(u^l^d):60>y?(u&l|u&d|l&d)-1894007588:(u^l^d)-899497514),f=d,d=l,l=u<<30|u>>>2,u=s,s=w}s+=m,u+=p,l+=g,d+=v,f+=h}return i=i.call(e,[s,u,l,d,f]),r&&r.asBytes?i:r&&r.asString?t.bytesToString(i):e.bytesToHex(i)};o._blocksize=16,o._digestsize=20,Xe=o}();var en,nn,tn=Xe,on={},rn=function(){this.outQueues=[],this.bufferFlushers=[],this.hasLoaded=!1,this.registeredOnLoadHandlers=[]},an="undefined"!=typeof window?re():void 0,cn=Object.freeze({__proto__:null,addGlobalContexts:function(e,n){ee(n,(function(n){n.core.addGlobalContexts(e)}))},addPlugin:function(e,n){ee(n,(function(n){n.addPlugin(e)}))},clearGlobalContexts:function(e){ee(e,(function(e){e.core.clearGlobalContexts()}))},clearUserData:function(e,n){ee(n,(function(n){n.clearUserData(e)}))},crossDomainLinker:function(e,n){ee(n,(function(n){n.crossDomainLinker(e)}))},disableAnonymousTracking:function(e,n){ee(n,(function(n){n.disableAnonymousTracking(e)}))},discardBrace:function(e,n){ee(n,(function(n){n.discardBrace(e)}))},discardHashTag:function(e,n){ee(n,(function(n){n.discardHashTag(e)}))},enableActivityTracking:function(e,n){ee(n,(function(n){n.enableActivityTracking(e)}))},enableActivityTrackingCallback:function(e,n){ee(n,(function(n){n.enableActivityTrackingCallback(e)}))},enableAnonymousTracking:function(e,n){ee(n,(function(n){n.enableAnonymousTracking(e)}))},flushBuffer:function(e,n){ee(n,(function(n){n.flushBuffer(e)}))},newSession:function(e){ee(e,(function(e){e.newSession()}))},newTracker:function(e,n,t){if(void 0===t&&(t={}),an)return te(e,e,"js-".concat("3.13.1"),n,an,t)},preservePageViewId:function(e){ee(e,(function(e){e.preservePageViewId()}))},removeGlobalContexts:function(e,n){ee(n,(function(n){n.core.removeGlobalContexts(e)}))},setBufferSize:function(e,n){ee(n,(function(n){n.setBufferSize(e)}))},setCollectorUrl:function(e,n){ee(n,(function(n){n.setCollectorUrl(e)}))},setCookiePath:function(e,n){ee(n,(function(n){n.setCookiePath(e)}))},setCustomUrl:function(e,n){ee(n,(function(n){n.setCustomUrl(e)}))},setDocumentTitle:function(e,n){ee(n,(function(n){n.setDocumentTitle(e)}))},setOptOutCookie:function(e,n){ee(n,(function(n){n.setOptOutCookie(e)}))},setReferrerUrl:function(e,n){ee(n,(function(n){n.setReferrerUrl(e)}))},setUserId:function(e,n){ee(n,(function(n){n.setUserId(e)}))},setUserIdFromCookie:function(e,n){ee(n,(function(n){n.setUserIdFromCookie(e)}))},setUserIdFromLocation:function(e,n){ee(n,(function(n){n.setUserIdFromLocation(e)}))},setUserIdFromReferrer:function(e,n){ee(n,(function(n){n.setUserIdFromReferrer(e)}))},setVisitorCookieTimeout:function(e,n){ee(n,(function(n){n.setVisitorCookieTimeout(e)}))},trackPageView:function(e,n){ee(n,(function(n){n.trackPageView(e)}))},trackSelfDescribingEvent:function(e,n){ee(n,(function(n){n.core.track(P({event:e.event}),e.context,e.timestamp)}))},trackStructEvent:function(e,n){ee(n,(function(n){var o=(n=n.core).track,r=e.category,i=e.action,a=e.label,c=e.property,s=e.value,u=t();u.add("e","se"),u.add("se_ca",r),u.add("se_ac",i),u.add("se_la",a),u.add("se_pr",c),u.add("se_va",null==s?void 0:s.toString()),o.call(n,u,e.context,e.timestamp)}))},updatePageActivity:function(e){ee(e,(function(e){e.updatePageActivity()}))},version:"3.13.1"}),sn=Object.freeze({__proto__:null,ClientHintsPlugin:ae}),un=Object.freeze({__proto__:null,OptimizelyXPlugin:ce}),ln=Object.freeze({__proto__:null,PerformanceTimingPlugin:se});!function(e){e.consent="consent",e.contract="contract",e.legalObligation="legal_obligation",e.vitalInterests="vital_interests",e.publicTask="public_task",e.legitimateInterests="legitimate_interests"}(nn||(nn={}));var dn,fn,mn,pn={},gn={},vn=Object.freeze({__proto__:null,ConsentPlugin:ue,enableGdprContext:function(e,n){void 0===n&&(n=Object.keys(pn));var t=e.documentId,o=e.documentVersion,r=e.documentDescription,i=nn[e.basisForProcessing];i?n.forEach((function(e){pn[e]&&(gn[e]={basisForProcessing:i,documentId:null!=t?t:null,documentVersion:null!=o?o:null,documentDescription:null!=r?r:null})})):dn.warn("enableGdprContext: basisForProcessing must be one of: consent, contract, legalObligation, vitalInterests, publicTask, legitimateInterests")},get gdprBasis(){return nn},trackConsentGranted:function(e,n){void 0===n&&(n=Object.keys(pn)),ne(n,pn,(function(n){var t=e.expiry,o={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:C({id:e.id,version:e.version,name:e.name,description:e.description})};t=P({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_granted/jsonschema/1-0-0",data:C({expiry:t})}}),o=[o],n.core.track(t,e.context?e.context.concat(o):o,e.timestamp)}))},trackConsentWithdrawn:function(e,n){void 0===n&&(n=Object.keys(pn)),ne(n,pn,(function(n){var t=e.all,o={schema:"iglu:com.snowplowanalytics.snowplow/consent_document/jsonschema/1-0-0",data:C({id:e.id,version:e.version,name:e.name,description:e.description})};t=P({event:{schema:"iglu:com.snowplowanalytics.snowplow/consent_withdrawn/jsonschema/1-0-0",data:C({all:t})}}),o=[o],n.core.track(t,e.context?e.context.concat(o):o,e.timestamp)}))}}),hn={},yn=!1,wn=Object.freeze({__proto__:null,GeolocationPlugin:le,enableGeolocationContext:de}),kn=Object.freeze({__proto__:null,GaCookiesPlugin:fe}),bn={},An={},_n=Object.freeze({__proto__:null,LinkClickTrackingPlugin:me,enableLinkClickTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(bn)),n.forEach((function(n){bn[n]&&(bn[n].sharedState.hasLoaded?(ve(e,n),he(n)):bn[n].sharedState.registeredOnLoadHandlers.push((function(){ve(e,n),he(n)})))}))},refreshLinkClickTracking:function(e){void 0===e&&(e=Object.keys(bn)),e.forEach((function(e){bn[e]&&(bn[e].sharedState.hasLoaded?he(e):bn[e].sharedState.registeredOnLoadHandlers.push((function(){he(e)})))}))},trackLinkClick:function(e,n){void 0===n&&(n=Object.keys(bn)),ne(n,bn,(function(n){n.core.track(T(e),e.context,e.timestamp)}))}});!function(e){e.CHANGE_FORM="change_form",e.FOCUS_FORM="focus_form",e.SUBMIT_FORM="submit_form"}(mn||(mn={}));var Pn=[mn.CHANGE_FORM,mn.FOCUS_FORM,mn.SUBMIT_FORM],Tn=["textarea","input","select"],Cn=function(e){return e},Sn={},On=Object.freeze({__proto__:null,FormTrackingPlugin:Ae,enableFormTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(Sn)),n.forEach((function(n){Sn[n]&&(Sn[n].sharedState.hasLoaded?ye(Sn[n],e):Sn[n].sharedState.registeredOnLoadHandlers.push((function(){ye(Sn[n],e)})))}))}}),xn={},En=Object.freeze({__proto__:null,ErrorTrackingPlugin:_e,enableErrorTracking:function(e,n){void 0===e&&(e={}),void 0===n&&(n=Object.keys(xn));var t=e.filter,o=e.contextAdder,r=e.context;B(window,"error",(function(e){if(t&&I(t)&&t(e)||null==t){var i=n,a=r||[];o&&I(o)&&(a=a.concat(o(e))),Pe({message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error,context:a},i)}}),!0)},trackError:Pe}),In={exports:{}};!function(e){var n,t,o,r,i,a;n={"America/Denver":["America/Mazatlan"],"America/Chicago":["America/Mexico_City"],"America/Asuncion":["America/Campo_Grande","America/Santiago"],"America/Montevideo":["America/Sao_Paulo","America/Santiago"],"Asia/Beirut":"Asia/Amman Asia/Jerusalem Europe/Helsinki Asia/Damascus Africa/Cairo Asia/Gaza Europe/Minsk Africa/Windhoek".split(" "),"Pacific/Auckland":["Pacific/Fiji"],"America/Los_Angeles":["America/Santa_Isabel"],"America/New_York":["America/Havana"],"America/Halifax":["America/Goose_Bay"],"America/Godthab":["America/Miquelon"],"Asia/Dubai":["Asia/Yerevan"],"Asia/Jakarta":["Asia/Krasnoyarsk"],"Asia/Shanghai":["Asia/Irkutsk","Australia/Perth"],"Australia/Sydney":["Australia/Lord_Howe"],"Asia/Tokyo":["Asia/Yakutsk"],"Asia/Dhaka":["Asia/Omsk"],"Asia/Baku":["Asia/Yerevan"],"Australia/Brisbane":["Asia/Vladivostok"],"Pacific/Noumea":["Asia/Vladivostok"],"Pacific/Majuro":["Asia/Kamchatka","Pacific/Fiji"],"Pacific/Tongatapu":["Pacific/Apia"],"Asia/Baghdad":["Europe/Minsk","Europe/Moscow"],"Asia/Karachi":["Asia/Yekaterinburg"],"Africa/Johannesburg":["Asia/Gaza","Africa/Cairo"]},t=function(){for(var e=[],n=0;11>=n;n++)for(var t=1;28>=t;t++){var o=-new Date(2014,n,t).getTimezoneOffset();o=null!==o?o:0,e?e&&e[e.length-1]!==o&&e.push(o):e.push()}return e},o=function e(n,t,o){void 0===t&&(t=864e5,o=36e5);var r=new Date(n.getTime()-t).getTime();n=n.getTime()+t;for(var i=new Date(r).getTimezoneOffset(),a=null;ri&&(s=u),i=l),r+=864e5}t=!(!c||!s)&&{s:o(c).getTime(),e:o(s).getTime()},e.push(t)}return e}();return function(e){for(var n=0;n=d.rules[m].s&&e[m].e<=d.rules[m].e)){f="N/A";break}if(f=0,f+=Math.abs(e[m].s-d.rules[m].s),864e6<(f+=Math.abs(d.rules[m].e-e[m].e))){f="N/A";break}}"N/A"!==(d=r(e,t,f,d))&&(o[l.name]=d)}for(var p in o)if(o.hasOwnProperty(p))for(e=0;ee?n[0]+",1":0n.length&&Array.isArray(n[0])&&(n=[{},n[0]]),r(e[0],n)})))}var a;if("string"==typeof n[0]&&d(n[1])&&(void 0===n[2]||Array.isArray(n[2]))){var c=n[0],s=n[1],f=n[2];(null===(a=n[3])||void 0===a||a)&&(a=u.setTimeout((function(){o(c)}),5e3),p[c]={timeout:a}),(a=l.createElement("script")).setAttribute("src",c),a.setAttribute("async","1"),B(a,"error",(function(){o(c),We.warn("Failed to load plugin ".concat(s[0]," from ").concat(c))}),!0),B(a,"load",(function(){var n=s[1],r=u[s[0]];if(r&&"object"==typeof r){var a=r[n];n=e(r,["symbol"==typeof n?n:n+""]),h.addPlugin.apply(null,[{plugin:a.apply(null,f)},t]),i(n)}o(c)}),!0),l.head.appendChild(a)}else{if("object"==typeof n[0]&&"string"==typeof n[1]&&(void 0===n[2]||Array.isArray(n[2]))){var m=n[0],v=n[1];if(a=n[2],m)return n=m[v],m=e(m,["symbol"==typeof v?v:v+""]),h.addPlugin.apply(null,[{plugin:n.apply(null,a)},t]),void i(m)}We.warn("Failed to add Plugin: ".concat(n[1]))}}function s(){for(var e=[],t=0;t Date: Mon, 10 Jul 2023 10:43:03 +0200 Subject: [PATCH 4/5] Add configuration for setting custom HTTP headers for requests to the collector (close #34) --- .../NetworkConfigurationReader.kt | 2 ++ doc/02-configuration.md | 1 + .../integration_test/configuration_test.dart | 17 +++++++++++++++++ .../NetworkConfigurationReader.swift | 4 ++++ lib/configurations/network_configuration.dart | 11 +++++++++-- lib/snowplow.dart | 7 ++++++- .../network_configuration_reader.dart | 8 +++++++- test/snowplow_test.dart | 17 +++++++++++++++++ 8 files changed, 63 insertions(+), 4 deletions(-) diff --git a/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/readers/configurations/NetworkConfigurationReader.kt b/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/readers/configurations/NetworkConfigurationReader.kt index 33a5c94..54087f2 100644 --- a/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/readers/configurations/NetworkConfigurationReader.kt +++ b/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/readers/configurations/NetworkConfigurationReader.kt @@ -20,6 +20,7 @@ class NetworkConfigurationReader(values: Map) { val endpoint: String by values val method: String? by valuesDefault val customPostPath: String? by valuesDefault + val requestHeaders: Map? by valuesDefault fun toConfiguration(): NetworkConfiguration { val networkConfig: NetworkConfiguration = if (method != null) { @@ -31,6 +32,7 @@ class NetworkConfigurationReader(values: Map) { NetworkConfiguration(endpoint) } customPostPath?.let { networkConfig.customPostPath(it) } + requestHeaders?.let { networkConfig.requestHeaders(it) } return networkConfig } } diff --git a/doc/02-configuration.md b/doc/02-configuration.md index 78a59f6..f6d8bee 100644 --- a/doc/02-configuration.md +++ b/doc/02-configuration.md @@ -22,6 +22,7 @@ The only required attributes of the `Snowplow.createTracker` method are `namespa | `endpoint` | `String` | URI for the Snowplow collector endpoint. | | `method` | `Method?` | HTTP method to use: `Method.get` or `Method.post` (`Method.post` is default). | | `customPostPath` | `String?` | Custom POST path. | +| `requestHeaders` | `Map?` | Map of custom HTTP headers to add to requests to the collector. | | `trackerConfig` | `TrackerConfiguration?` | Configuration of the tracker and the core tracker properties. | | `gdprConfig` | `GdprConfiguration?` | Determines the GDPR context that will be attached to all events sent by the tracker. | | `subjectConfig` | `SubjectConfiguration?` | Subject information about tracked user and device that is added to events. | diff --git a/example/integration_test/configuration_test.dart b/example/integration_test/configuration_test.dart index c019a56..6dd158c 100644 --- a/example/integration_test/configuration_test.dart +++ b/example/integration_test/configuration_test.dart @@ -246,4 +246,21 @@ void main() { return true; }); }); + + testWidgets("sets custom request headers", (WidgetTester tester) async { + SnowplowTracker tracker = await Snowplow.createTracker( + namespace: 'custom-headers', + endpoint: SnowplowTests.microEndpoint, + requestHeaders: {'Warning': 'works'}); + + await tracker + .track(const Structured(category: 'category', action: 'action')); + + expect( + await SnowplowTests.checkMicroGood((events) => + (events.length == 1) && + (events[0]['rawEvent']['context']['headers'] + .contains('Warning: works'))), + isTrue); + }); } diff --git a/ios/Classes/readers/configurations/NetworkConfigurationReader.swift b/ios/Classes/readers/configurations/NetworkConfigurationReader.swift index 40e9795..d7d6da5 100644 --- a/ios/Classes/readers/configurations/NetworkConfigurationReader.swift +++ b/ios/Classes/readers/configurations/NetworkConfigurationReader.swift @@ -16,6 +16,7 @@ struct NetworkConfigurationReader: Decodable { let endpoint: String let method: String? let customPostPath: String? + let requestHeaders: [String: String]? } extension NetworkConfigurationReader { @@ -31,6 +32,9 @@ extension NetworkConfigurationReader { if let c = customPostPath { networkConfig.customPostPath(c) } + if let h = requestHeaders { + networkConfig.requestHeaders(h) + } return networkConfig } } diff --git a/lib/configurations/network_configuration.dart b/lib/configurations/network_configuration.dart index c5e8de5..e93e536 100644 --- a/lib/configurations/network_configuration.dart +++ b/lib/configurations/network_configuration.dart @@ -26,8 +26,14 @@ class NetworkConfiguration { /// You will need to configure your collector to accept your custom path. final String? customPostPath; + /// Custom HTTP headers to add to HTTP requests to the collector. + final Map? requestHeaders; + const NetworkConfiguration( - {required this.endpoint, this.method, this.customPostPath}); + {required this.endpoint, + this.method, + this.customPostPath, + this.requestHeaders}); Map toMap() { final conf = { @@ -35,7 +41,8 @@ class NetworkConfiguration { 'method': method?.name, 'customPostPath': customPostPath?[0] == '/' ? customPostPath?.substring(1) - : customPostPath + : customPostPath, + 'requestHeaders': requestHeaders }; conf.removeWhere((key, value) => value == null); return conf; diff --git a/lib/snowplow.dart b/lib/snowplow.dart index 6cf6bf0..711ca02 100644 --- a/lib/snowplow.dart +++ b/lib/snowplow.dart @@ -34,11 +34,13 @@ class Snowplow { /// [endpoint] refers to the Snowplow collector endpoint. /// [method] is the HTTP method used to send events to collector and it defaults to POST. /// [customPostPath] is an optional string for custom POST collector paths. + /// [requestHeaders] is an optional map of custom HTTP headers to add to requests to the collector. static Future createTracker( {required String namespace, required String endpoint, Method? method, String? customPostPath, + Map? requestHeaders, TrackerConfiguration? trackerConfig, SubjectConfiguration? subjectConfig, GdprConfiguration? gdprConfig, @@ -46,7 +48,10 @@ class Snowplow { final configuration = Configuration( namespace: namespace, networkConfig: NetworkConfiguration( - endpoint: endpoint, method: method, customPostPath: customPostPath), + endpoint: endpoint, + method: method, + customPostPath: customPostPath, + requestHeaders: requestHeaders), trackerConfig: trackerConfig, subjectConfig: subjectConfig, gdprConfig: gdprConfig, diff --git a/lib/src/web/readers/configurations/network_configuration_reader.dart b/lib/src/web/readers/configurations/network_configuration_reader.dart index 7fc51cd..a14b609 100644 --- a/lib/src/web/readers/configurations/network_configuration_reader.dart +++ b/lib/src/web/readers/configurations/network_configuration_reader.dart @@ -18,7 +18,10 @@ class NetworkConfigurationReader extends NetworkConfiguration { method: map['method'] == null ? null : Method.values.byName(map['method']), - customPostPath: map['customPostPath']); + customPostPath: map['customPostPath'], + requestHeaders: map['requestHeaders'] == null + ? null + : (map['requestHeaders'] as Map).cast()); void addTrackerOptions(dynamic options) { if (method != null) { @@ -27,5 +30,8 @@ class NetworkConfigurationReader extends NetworkConfiguration { if (customPostPath != null) { options['postPath'] = '/$customPostPath'; } + if (requestHeaders != null) { + options['customHeaders'] = requestHeaders; + } } } diff --git a/test/snowplow_test.dart b/test/snowplow_test.dart index 82d72fa..b427139 100644 --- a/test/snowplow_test.dart +++ b/test/snowplow_test.dart @@ -122,6 +122,23 @@ void main() { })); }); + test('createsTrackerWithCustomRequestHeaders', () async { + await Snowplow.createTracker( + namespace: 'tns1', + endpoint: 'https://snowplowanalytics.com', + requestHeaders: {'header1': 'value1', 'header2': 'value2'}); + + expect( + methodCall, + isMethodCall('createTracker', arguments: { + 'namespace': 'tns1', + 'networkConfig': { + 'endpoint': 'https://snowplowanalytics.com', + 'requestHeaders': {'header1': 'value1', 'header2': 'value2'} + } + })); + }); + test('createsTrackerWithEmitterConfig', () async { await Snowplow.createTracker( namespace: 'tns1', From aec4fd35a3b160811e0819cb44917c591212709d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matu=CC=81s=CC=8C=20Tomlein?= Date: Mon, 10 Jul 2023 12:04:32 +0200 Subject: [PATCH 5/5] Prepare for 0.4.0 release --- CHANGELOG.md | 9 +++++++++ README.md | 2 +- .../snowplowanalytics/snowplow_tracker/TrackerVersion.kt | 2 +- doc/01-getting-started.md | 2 +- example/ios/Podfile.lock | 4 ++-- example/lib/overview.dart | 2 +- example/pubspec.lock | 2 +- ios/Classes/TrackerVersion.swift | 2 +- ios/snowplow_tracker.podspec | 2 +- pubspec.yaml | 2 +- 10 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca3115f..8428509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,17 @@ +# 0.4.0 + +* Add configuration for setting custom HTTP headers for requests to the collector (#34) +* Upgrade underlying iOS and Android trackers to version 5 (#36) +* Remove deprecated kotlin-android-extensions plugin in example app (#35) +* Upgrade JavaScript tracker in the example app to version 3.13 + # 0.3.0 + * Enable screen and application context on mobile (#27) * Add anonymous tracking features (#16) # 0.2.0 + * Configure custom POST path (#15) * Upgrade underlying mobile native trackers to version 4 (#17) * Fix schema link in documentation for ScreenView (#12) diff --git a/README.md b/README.md index b6a6abc..38b0446 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ This will add a line with the dependency like this to your `pubspec.yaml`: ```yml dependencies: - snowplow_tracker: ^0.3.0 + snowplow_tracker: ^0.4.0 ``` Import the package into your Dart code: diff --git a/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/TrackerVersion.kt b/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/TrackerVersion.kt index 6f80ebb..1d47b78 100644 --- a/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/TrackerVersion.kt +++ b/android/src/main/kotlin/com/snowplowanalytics/snowplow_tracker/TrackerVersion.kt @@ -12,5 +12,5 @@ package com.snowplowanalytics.snowplow_tracker object TrackerVersion { - val TRACKER_VERSION = "flutter-0.3.0" + val TRACKER_VERSION = "flutter-0.4.0" } diff --git a/doc/01-getting-started.md b/doc/01-getting-started.md index d4d9a92..3da46d5 100644 --- a/doc/01-getting-started.md +++ b/doc/01-getting-started.md @@ -16,7 +16,7 @@ This will add a line with the dependency like to your pubspec.yaml: ```yml dependencies: - snowplow_tracker: ^0.3.0 + snowplow_tracker: ^0.4.0 ``` Import the package into your Dart code: diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 7f7135a..bd2401b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -5,7 +5,7 @@ PODS: - FMDB/standard (2.7.5) - integration_test (0.0.1): - Flutter - - snowplow_tracker (0.3.0): + - snowplow_tracker (0.4.0): - Flutter - SnowplowTracker (~> 5.4) - SnowplowTracker (5.4.0): @@ -33,7 +33,7 @@ SPEC CHECKSUMS: Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a integration_test: 13825b8a9334a850581300559b8839134b124670 - snowplow_tracker: f3d9416ea1d05205fc242d4786b98d207337a6dc + snowplow_tracker: 022a7e65a05a6f6043043d58d8df870b379efe5d SnowplowTracker: a7fa5ae461955637f773a51c941635f39a5b0747 PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 diff --git a/example/lib/overview.dart b/example/lib/overview.dart index 3804f13..bb2269c 100644 --- a/example/lib/overview.dart +++ b/example/lib/overview.dart @@ -27,7 +27,7 @@ This will add a line with the dependency like this to your `pubspec.yaml`: ```yml dependencies: - snowplow_tracker: ^0.3.0 + snowplow_tracker: ^0.4.0 ``` Import the package into your Dart code: diff --git a/example/pubspec.lock b/example/pubspec.lock index 4f600b2..822938c 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -226,7 +226,7 @@ packages: path: ".." relative: true source: path - version: "0.3.0" + version: "0.4.0" source_span: dependency: transitive description: diff --git a/ios/Classes/TrackerVersion.swift b/ios/Classes/TrackerVersion.swift index bb99cc1..c0115d2 100644 --- a/ios/Classes/TrackerVersion.swift +++ b/ios/Classes/TrackerVersion.swift @@ -12,5 +12,5 @@ import Foundation class TrackerVersion { - static let TRACKER_VERSION = "flutter-0.3.0" + static let TRACKER_VERSION = "flutter-0.4.0" } diff --git a/ios/snowplow_tracker.podspec b/ios/snowplow_tracker.podspec index 37e822b..20d2270 100644 --- a/ios/snowplow_tracker.podspec +++ b/ios/snowplow_tracker.podspec @@ -4,7 +4,7 @@ # Pod::Spec.new do |s| s.name = 'snowplow_tracker' - s.version = '0.3.0' + s.version = '0.4.0' s.summary = 'A package for tracking Snowplow events in Flutter apps.' s.description = <<-DESC A package for tracking Snowplow events in Flutter apps. diff --git a/pubspec.yaml b/pubspec.yaml index 774e1c3..9f2dfbc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: snowplow_tracker description: A package for tracking Snowplow events in Flutter apps -version: 0.3.0 +version: 0.4.0 homepage: https://github.com/snowplow-incubator/snowplow-flutter-tracker repository: https://github.com/snowplow-incubator/snowplow-flutter-tracker